1:字符串遍历匹配的问题
思路1:
最能想到的是用substring
class Solution {
public int strStr(String haystack, String needle) {
if(haystack.length()==0&&needle.length()==0){
return 0;
}
int len1 =haystack.length();
int len2= needle.length();
//其实下面这里也可以写成i<=len1-len2;
//为了更快的遍历完字符串1,只用遍历到len1-len2+1的位置,找到匹配相等的字符起始的下标,
for(int i=0;i<len1-len2+1;i++){
if(haystack.substring(i,i+len2).equals(needle)){
return i;
}
}
return -1;
}
}
需要注意的是substring(i,i+len);
这里截取的长度是len,此外需要注意的是i+len对应的下标的字符是截取不到的,因为下标是从0开始的,
思路2:
比较麻烦:
双重遍历,这里需要注意:if(haystack.charAt(i+j)==needle.charAt(j)) 如果变成charAt(i);
不加j会有一个什么样的效果:致使每次str2的字符往后遍历,str还是站在原地不动,
所以匹配自飞字符串的话
暴力解法不要忘了:i+j,指针1和指针2遍历的一致性;
可以把i换成base,j换成move,这样就好理解;
base+move++;
class Solution {
public int strStr(String haystack, String needle) {
if(haystack.length()==0&&needle.length()==0){
return 0;
}
for(int i=0;i<haystack.length()-needle.length()+1;i++){
int j=0;
for(j=0;j<needle.length();j++){
if(haystack.charAt(i+j)==needle.charAt(j)){
continue;
}
else{
break;
}
}
if(j==needle.length()){
return i;
}
}
return -1;
}
}
思路3:优化思路2,可以去掉continue,else ,没有意义的代码
class Solution {
public int strStr(String haystack, String needle) {
if(haystack.length()==0&&needle.length()==0){
return 0;
}
for(int i=0;i<haystack.length();i++){
int j=0;
for(j=0;j<needle.length();j++){
if(haystack.charAt(i+j)!=needle.charAt(j)){
break;
}
}
if(j==needle.length()){
return i;
}
}
return -1;
}
}