给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
- 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
- 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
方法一:循环
思路:
- ◇ 双指针遍历;
- ◇ 找到最开始和最后面的一个为大小写字母或者数字的字符,如果没有则直接返回 true;
- ◇ 如果前指针小于后指针 ,则判断两者是否相同,相同继续,不相同直接返回 false 。
function strStr(haystack: string, needle: string): number {
let index1 = 0;
let index2 = 0;
if(needle.length == 0)
return 0;
// 找到第一个和 needle 匹配的字符串
for(let i=0; i < haystack.length; i++) {
if(haystack[i] == needle[index2]) {
if(index2 == 0) {
index1 = i;
}
index2 ++;
if(index2 == needle.length) {
return i - needle.length + 1;
}
} else {
if(index2 != 0) {
index2 = 0;
i = index1;
}
}
}
return -1;
};
方法二:KMP
思路:
- ◇ 双指针遍历;
- ◇ 找到最开始和最后面的一个为大小写字母或者数字的字符,如果没有则直接返回 true;
- ◇ 如果前指针小于后指针 ,则判断两者是否相同,相同继续,不相同直接返回 false 。
function strStr(haystack: string, needle: string): number {
let index1 = 0;
let index2 = 0;
let next = getNext(needle);
if(needle.length == 0)
return 0;
while (index1 < haystack.length && index2 < needle.length) {
if (index2 == -1 || haystack[index1] == needle[index2]) {
index1++;
index2++;
} else {
index2 = next[index2];
}
}
if (index2 == needle.length) {
return index1 - index2;
}else {
return -1;
}
};
function getNext(needle: string) {
let next: number[] = [];
next[0] = -1;
let j = 0;
let k = -1;
while (j < needle.length - 1) {
if (k == -1 || needle[j] == needle[k]) {
if (needle[++j] == needle[++k]) {
next[j] = next[k];
} else {
next[j] = k;
}
} else {
k = next[k];
}
}
return next;
}