算法学习5(题解)
1.题目
给你两个字符串haystack
和needle
,请你在haystack
字符串中找出needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果needle
不是haystac
的一部分,则返回 -1
。
2.实例
实例1
输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。
实例二
输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。
实例三
输入:haystack = "imimmip", needle = "immip"
输出:2
3.代码
鄙人的:
public int strStr(String haystack, String needle) {
int len = 0, temp = 0;
for(int i = 0;i < haystack.length();i++){
/* 找到第一个相等的字符位置 */
if(haystack.charAt(i) == needle.charAt(len)){
len = i + needle.length();
int x = i+1;
if(len > haystack.length()){
return -1;
}
if(needle.length() == 1){
return i;
}
/* 查找剩下的*/
for (int j = 1; x < len; x++, j++) {
if(haystack.charAt(x) != needle.charAt(j)){
break;
}
/* Found whole string. */
if (x == len-1){
return a;
}
}
len = 0;
}
}
return -1;
}
官方的:
public int strStr(String haystack, String needle) {
int sl = haystack.length();
int cl = needle.length();
if (cl > sl) {
return -1;
}
char first = needle.charAt(0);
int max = sl-cl;
for (int i = 0; i <= max; i++) {
/* 找到第一个相等的字符位置 */
if (haystack.charAt(i) != first) {
while (++i <= max && haystack.charAt(i) != first);
}
/* 查找剩下的*/
if (i <= max) {
int j = i + 1;
int end = j+cl-1;
for (int k = 1; j < end && haystack.charAt(j) == needle.charAt(k); j++, k++);
if (j == end) {
/* Found whole string. */
return i ;
}
}
}
return -1;
}
来源:力扣(LeetCode)
4.思路
鄙人的方法和leetcode
官方题解的方法差不多,解法就有些许不同。
- 首先通过遍历
haystack
与needle
的第一个字符进行比较找出第一个相等的字母,找不到的话我直接返回-1
,leetcode
则做了预处理;
if(len > haystack.length()){
return -1;
}
-------------------------------
int max = sl-cl;
for (int i = 0; i <= max; i++) {
- 接下来就是匹配剩下的字母,匹配成功的话就返回开始索引,匹配不成功的话则继续进行下一次循环,设置外循环的原因是为了处理
实例三
这类情况——开头字母重复出现,需要依次遍历排除; - 匹配成功的条件都是第二个循环中的索引值是否增加了
needle
字符个长度,区别在于leetcode
在循环外进行判断,而我在循环中进行判断,效率更低而且还要额外排除needle
长度为1
的情况,显得多此一举。
if(needle.length() == 1){
return i;
}