28. 找出字符串中第一个匹配项的下标
学习kmp算法的原理与实现
O(m+n)
public static int[] getNext(String p) {//计算每一位字符前的最长公共前后缀
int[] next=new int[p.length()];
int i=0,j=-1;
next[0]=-1;
while(i<p.length()-1){
if(j==-1||p.charAt(i)==p.charAt(j)){
i++;
j++;
next[i]=j;
}
else {
j=next[j];
}
}return next;
}
public int strStr(String haystack, String needle) {
int[] next = getNext(needle);
int i = 0, j = 0;
while (i < haystack.length() && j < needle.length()) {
if (j == -1 || haystack.charAt(i) == needle.charAt(j)) {
i++;
j++;
} else {
j = next[j];
}
}
if (j == needle.length()) {
return i - j;
} else {
return -1;
}
}
459.重复的子字符串
用最少的代码量过了 有kmp算法思路的没有看 实在没时间了 要是深入研究故意要花半天甚至还多
先过了 kmp确实是个坑
public boolean repeatedSubstringPattern(String s) {
return (s+s).indexOf(s,1)!=s.length();
}
双指针专题
27. 移除元素
做道双指针找找自信
public int removeElement(int[] nums, int val) {
int left=0,right=nums.length;
while(left<right){
if(nums[left]==val){
nums[left]=nums[--right];
}
else left++;
}
return nums.length-left;
}