您的位置:首页 > 其它

题目:字符串查找

2015-08-19 19:16 417 查看
字符串查找(又称查找子字符串),是字符串操作中一个很有用的函数。你的任务是实现这个函数。

对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。

如果不存在,则返回
-1


您在真实的面试中是否遇到过这个题?

Yes

哪家公司问你的这个题?
Airbnb
Alibaba
Amazon Apple
Baidu Bloomberg
Cisco Dropbox
Ebay Facebook
Google Hulu
Intel Linkedin
Microsoft NetEase
Nvidia Oracle
Pinterest Snapchat
Tencent Twitter
Uber Xiaomi
Yahoo Yelp
Zenefits
感谢您的反馈

样例

如果 source =
"source"
和 target =
"target"
,返回
-1


如果 source =
"abcdabcdefg"
和 target =
"bcd"
,返回
1


挑战

O(n2)的算法是可以接受的。如果你能用O(n)的算法做出来那更加好。(提示:KMP)

说明

在面试中我是否需要实现KMP算法?

不需要,当这种问题出现在面试中时,面试官很可能只是想要测试一下你的基础应用能力。当然你需要先跟面试官确认清楚要怎么实现这个题。

标签 Expand

基本实现

字符串处理

lass Solution {

/**

* Returns a index to the first occurrence of target in source,

* or -1 if target is not part of source.

* @param source string to be scanned.

* @param target string containing the sequence of characters to match.

*/

public int strStr(String source, String target) {

//write your code here

int res = -1;

if(source == null){

return res;

}

if(target ==null){

res = -1;

return res;

}

if(source.equals(target)){

res = 0;

return res;

}

boolean flag = false; //找到标志

for(int i=0;i<=source.length()-1&&!flag;i++){

for(int j=i;j<=source.length()-1;j++){

if(target.equals(source.substring(i, j))){

res = i;

flag = true;

break;

}

}

}

return res;

}

}

方法2:KMP方法

KMP需要创建一个next[]数组,用于进行移位。

class Solution {

/**

* Returns a index to the first occurrence of target in source,

* or -1 if target is not part of source.

* @param source string to be scanned.

* @param target string containing the sequence of characters to match.

*/

public int strStr(String source, String target) {

//write your code here

int res = -1;

if (source == null) {

return res;

}

if (target == null) {

res = -1;

return res;

}

if (source.equals(target)) {

res = 0;

return res;

}

if(target.length()==0){

res = 0;

return res;

}

int next[] = new int[target.length()];

getNext(next, target);

int tj = 0;

for (int i = 0; i < source.length(); i++) {

while (source.charAt(i) != target.charAt(tj) && tj != 0) {

tj = next[tj - 1];

}

if (tj == target.length() - 1) {

return i - target.length() + 1;

} else {

tj++;

}

}

return res;

}

public void getNext(int next[], String target) {

for (int i = 0; i < target.length() - 1; i++) {

next[i] = 0;

}

for (int i = 1; i < target.length(); i++) {

int j = next[i - 1];

if (target.charAt(i) == target.charAt(j)) {

next[i] = next[i - 1] + 1;

}

}

}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: