對(duì)于一個(gè)給定的 source 字符串和一個(gè) target 字符串,你應(yīng)該在 source 字符串中找出 target 字符串出現(xiàn)的第一個(gè)位置(從0開(kāi)始)。如果不存在,則返回 -1。
說(shuō)明:在面試中我是否需要實(shí)現(xiàn)KMP算法?
- 不需要,當(dāng)這種問(wèn)題出現(xiàn)在面試中時(shí),面試官很可能只是想要測(cè)試一下你的基礎(chǔ)應(yīng)用能力。當(dāng)然你需要先跟面試官確認(rèn)清楚要怎么實(shí)現(xiàn)這個(gè)題。
- 樣例
如果 source = "source" 和 target = "target",返回 -1。
如果 source = "abcdabcdefg" 和 target = "bcd",返回 1。
O(n2)的算法是可以接受的。如果你能用O(n)的算法做出來(lái)那更加好。(提示:KMP)
public class strStr {
/**
* 解決思路:首先我們有source字符串和target字符串,source字符串最后的幾個(gè)字符串長(zhǎng)度小于target肯定不會(huì)有首次出現(xiàn)的可能。
* 所以應(yīng)該進(jìn)行遍歷操作的source字符串的長(zhǎng)度是(source.length-target.length)的長(zhǎng)度。
* 在上面那個(gè)遍歷中,我們可以獲取source的position獲取具體字符,再將target的所有字符串進(jìn)行遍歷,如果第一個(gè)字符與source的相同
* 那么
* ,繼續(xù)下一個(gè)target及下一個(gè)source中的字符進(jìn)行對(duì)比,直到target.length次后如果完全想同則返回外層遍歷那個(gè)position,
* 如果不同則返回上層遍歷,postion+1,繼續(xù)進(jìn)行target的比對(duì)操作,如果全部沒(méi)有則返回-1;
* 時(shí)間復(fù)雜度為:O(n^2)
*/
public int solution(String source, String target) {
if (source == null || target == null) {
return -1;
}
for (int i = 0; i <= source.length() - target.length(); i++) {
int j = 0;
for (j = 0; j < target.length(); j++) {
if (source.charAt(i + j) != target.charAt(j))
break;
}
if (j == target.length()) {
return i;
}
}
return -1;
}
}