题目:字符串查找
2015-08-19 19:16
417 查看
字符串查找(又称查找子字符串),是字符串操作中一个很有用的函数。你的任务是实现这个函数。
对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。
如果不存在,则返回
您在真实的面试中是否遇到过这个题?
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 =
挑战
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;
}
}
}
}
对于一个给定的 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;
}
}
}
}
相关文章推荐