字符串
定长顺序存储:地址连续、长度固定
堆存储:地址连续、动态分配空间
块链存储:
每个结点可以存放一个字符或者多个字符,结点大小的选择、顺序存储的方式、可能有空间浪费
串的模式匹配算法
求一个子串在原字符串中首次出现的位置
public static int subStringIndex(String string,String subString){ int i=0; for(;i<=string.length()-subString.length();i++){ int j; for(j=0;j<subString.length();j++){ System.out.println(string.charAt(i) + " " +subString.charAt(j)); if(string.charAt(i) == subString.charAt(j)){ i++; }else{ i = i-j; break; } } if(j>=subString.length()){ break; } } if(i>=string.length()){ return -1; }else{ return i-subString.length(); } }
改进
KMP算法
上述算法,每一次都是从原始字符串的下一个位置开始,从头与模式串进行比较
KMP算法,在一次匹配过程中,如果某一个字符不一样,不需要从原始串的下一个位置比较,而是将模式串尽可能多地向后移动一段距离
当匹配失败时,如果主串的第i个字符和模式串的第j个字符匹配失败,不需要将指针i退回到之前的下一位置,而是确定主串中的第i个字符应当与模式串中的哪个字符继续比较(确定下一趟比较中j的位置)
如何匹配?
i:指向原字符串
j:指向模式串
比较i和j位置上的字符,相等,i++ j++
不相等,i不变,j = next[j];
如果此时的next[j]等于0,则需要将i和j都加1;如果此时的next[j]是非0 值,则从i和j的位置开始进行比较
next[j]的值仅仅取决于模式串本身,构造一个函数,专门用于计算next[j]的值
public static int[] nextJ(String subString){ int length = subString.length(); int next[] = new int[length+1]; next[0] = length; int j = 1; int k = next[j]; //next[1]=0 while(j<length){ if(k==0 || subString.charAt(k-1) == subString.charAt(j-1)){ ++k; ++j; next[j] = k; }else { k = next[k]; } } return next; }