X Tutup
/** * @Author:Aliyang * @Data: Created in 下午9:26 18-6-16 * implement-strstr:我的解法 * 思路:kmp算法 **/ public class T122 { public String strStr(String haystack, String needle) { if (needle.equals("")) return haystack; if (haystack.equals("")) return null; int index=-1; if ((index=kmp(haystack,needle))!=-1) return haystack.substring(index,haystack.length()); return null; } // kmp算法 private int kmp(String str,String ptr){ int slen=str.length(); int plen=ptr.length(); int[] next=catNext(ptr);//计算next数组 int k=-1; for (int i=0;i-1&&ptr.charAt(k+1)!=str.charAt(i))//ptr和str的当前位置不匹配,往前回溯直到找到前缀子串最后一个位置和当前str位置i的字符相等的前缀子串 k=next[k]; if (ptr.charAt(k+1)==str.charAt(i))//当str的i处和模式串的k+1位置相等,那么前缀子串往后一位 k=k+1; if (k==plen-1){//k到达模式串的末尾,说明k和目前str的子串完全匹配上 return i-plen+1; } } return -1; } // 计算next数组 private int[] catNext(String str){ int len=str.length(); int[] next=new int[len]; next[0]=-1; int k=-1; for (int i=1;i<=len-1;i++){ while (k>-1&&str.charAt(k+1)!=str.charAt(i)){//找到前缀子串最后一个数和新来的索引位置i处的数相等的前锥子穿 k=next[k]; } if (str.charAt(k+1)==str.charAt(i)){//如果新的数和当前的k相等,那么前缀子串k+1,说明当前k+1长的前缀子串和后缀子串匹配 k=k+1; } next[i]=k; } return next; } public static void main(String[] args){ } }
X Tutup