字符串

定长顺序存储:地址连续、长度固定

堆存储:地址连续、动态分配空间

块链存储:

  每个结点可以存放一个字符或者多个字符,结点大小的选择、顺序存储的方式、可能有空间浪费

  

 

串的模式匹配算法

求一个子串在原字符串中首次出现的位置

    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;
    }