7.31数据结构与算法-4(KMP算法)(查找数组的重复数)

1.java中的 charAt 方法

charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1
代码

ublic class Test {
    public static void main(String args[]) {
        String s = "www.runoob.com";
        char result = s.charAt(8);
        System.out.println(result);
    }
}
//以上程序执行结果为:
o

2.KMP

image.png

image.png

image.png

代码实现

import java.lang.reflect.Array;
import java.util.Arrays;

public class Demo5 {
    public static void main(String[] args) {
      int[] aaaas = kepNext("AAAB");
        System.out.println(Arrays.toString(aaaas));
//        System.out.println(Arrays.toString(aaaas));
        String st = "AAC BBCCDCAACDAACDE";
        String st1 = "AAAB";
        //jg
        int km = kmpSearch(st, st1,  aaaas);
        System.out.println(km);
    }

    public static int kmpSearch(String st, String st1, int[] next) {
        for (int i = 0, j = 0; i < st.length(); i++) {
            while (j > 0 && st.charAt(i) != st1.charAt(j))
                j = next[j - 1];
//从这个 j的位置开始匹配
            // j 为负数的时候不执行 直到下一次
            // if (st.charAt(i) == st1.charAt(j))  使得j++
            if (st.charAt(i) == st1.charAt(j)) {
                j++;
            }
            if (st1.length() == j) {
                return i + 1 - j;
            }
        }
        return -1;

    }

    //    获取一个部分匹配表
    public static int[] kepNext(String areas) {
//创建一个next 数组
        int[] next = new int[areas.length()];
        next[0] = 0;


//        匹配值j加1
        for (int i = 1, j = 0; i < areas.length(); i++) {
//            核心算法
            // 非常重要 直到 j = 0 && areas.charAt(i) == areas.charAt(j)
            //成立 才能退出while 循环
            //
            while (j > 0 && areas.charAt(i) != areas.charAt(j)) {
                j = next[j - 1];
                //如果只循环一次 例如重复的AA 在下一次 由2 变成 1 
            }
            if (areas.charAt(i) == areas.charAt(j)) {
                j++;
            }
            next[i] = j;
        }
        return next;
    }
}

3.KMP 算法思想

此方法也可生产next数组

void GetNext(char* p,int next[])  
{  
    int pLen = strlen(p);  
    next[0] = -1;  
    int k = -1;  
    int j = 0;  
    while (j < pLen - 1)  
    {  
        //p[k]表示前缀,p[j]表示后缀  
        if (k == -1 || p[j] == p[k])   
        {  
            ++k;  
            ++j;  
            next[j] = k;  
        }  
        else   
        {  
            k = next[k];  
        }  
    }  
}  

4,BM算法

5.Sunday算法

6.查找数组的重复数

#//先排序后查找
import java.util.Arrays;

public class Demo10 {
    public static void main(String[] args) {
        int array[] = {1, 4, 6, 7, 8, 9, 5, 6, 7, 90, 99};
       Arrays.sort(array);//这个方法是用来排序的
        System.out.println(Arrays.toString(array));
        for (int i = 1; i < array.length; i++) {
            if (array[i] ==array[i-1]){
                System.out.println(array[i]);
            }
            else {

            }
        }
    }
}

使用集合

mport java.util.HashSet;

public class Demo11 {
    public static void main(String[] args) {
int [] array ={1,3,4,6,9,9,56,7,56,44,22,89,90 };

        HashSet objects = new HashSet<>();
//HashSet 不能储存相同的对象

        int lon = array.length;
        for (int i = 0; i < lon; i++) {
            if (!objects.add(array[i])){
                System.out.println(array[i]);
            }else {}


        }

    }
}

你可能感兴趣的:(7.31数据结构与算法-4(KMP算法)(查找数组的重复数))