字符串总结,主要是kmp与双指针

字符串总结

字符串常用的算法思想,双指针翻转
kmp:通过记录前缀避免每次重新查找时在从头找

 1import java.util.ArrayList;
 2import java.util.List;
 3
 4/**
 5 * 28. 实现 strStr()
 6 * 实现 strStr() 函数。
 7 * 
24public class StrStr {
25
26    /**
27     * kmp算法
28     * 构建next前缀数组,存储匹配个数的数组
29     * 步骤
30     * 初始化
31     * 处理前缀不相同情况
32     * 处理前缀相同情况
33     * 注意的是在处理前后缀不相同时 j要想后走,如果是第一位就不走了
34     * 处理前后缀相同的时候j先加一,然后把 j的值 赋给next[i]
35     *
36     * @param haystack
37     * @param needle
38     * @return
39     */
40    private static int[] getNext(int[] next, String needle) {
41        int j = 0;
42        next[0] = j;
43        for (int i = 1; i < needle.length(); i++) {
44            while (j > 0 && needle.charAt(j) != needle.charAt(i)) {
45                j = next[j - 1];
46            }
47
48            if (needle.charAt(j) == needle.charAt(i)) {
49                j++;
50            }
51            next[i] = j;
52        }
53        return next;
54    }
55
56    /**
57     * 这里是直接用next 不进行任何操作
58     * @param haystack 文本串
59     * @param needle   模式串
60     * @return
61     */
62    public static int strStr(String haystack, String needle) {
63        if ("".equals(needle)) {
64            return 0;
65        }
66
67        int[] next = new int[needle.length()];
68        next = getNext(next, needle);
69
70        int j = 0;
71        for (int i = 0; i < haystack.length(); i++) {
72            while (j > 0 && haystack.charAt(i) != needle.charAt(j)) {
73                j = next[j - 1];
74            }
75            if (haystack.charAt(i) == needle.charAt(j)) {
76                j++;
77            }
78            if (j == needle.length()) {
79                return i - needle.length() + 1;
80            }
81        }
82        return -1;
83    }
84
85    public static void main(String[] args) {
86        String str1 = "abaaba";
87        String str2 = "abaf";
88        System.out.println(strStr(str1, str2));
89    }
90}
上一篇:吴恩达机器学习作业8(下)--- 推荐系统


下一篇:【DB笔试面试791】在Oracle中,BBED模拟修复坏块。