public int indexOf(String s1,String s2){
if(s1.length()<s2.length())
return -1;
else if(s1.substring(s1.length()-s2.length()).equals(s2))
return s1.length()-s2.length();
else
return indexOf(s1.substring(0,s1.length()-1),s2);
}
我写了这个方法来获取第一个字符串中第二个字符串的索引 但它有一个错误,它无法有效地返回第一个出现的第二个字符串,这是因为我使用逻辑从后面找到第二个字符串,我想不出任何其他逻辑。任何建议将不胜感激。
example of a failure case: firstString "BarackObama" second string "a"
答案 0 :(得分:1)
正如您所说,您正在倒退。相反,你应该继续前进:
public static int indexOf(String s1, String s2){
if(s1.length()<s2.length()) {
return -1;
}
else if(s1.substring(0, s2.length()).equals(s2)) {
return 0;
}
else {
int i = indexOf(s1.substring(1, s1.length()), s2);
if (i == -1) {
return i;
} else {
return 1 + i;
}
}
}
示例:
String s1 = "BarackObama";
String s2 = "rac";
indexOf(s1, s2);
它会像这样运行:
indexOf("BarackObama", "rac"):
"BarackObama".substring(0, 3).equals("rac") -> false
return 1 + indexOf("BarackObama".substring(1, 11), "rac")
indexOf("arackObama", "rac"):
"arackObama".substring(0, 3).equals("rac") -> false
return 1 + indexOf("arackObama".substring(1, 10), "rac")
indexOf("rackObama", "rac"):
"rackObama".substring(0, 3).equals("rac") -> true
return 0;
return 0 + 1 + 1 = 2
答案 1 :(得分:0)
我认为你使用subString(int startIndex)
的方式,它会从最后给你角色。如果仅将参数传递给subString方法,则它将作为它返回的subString的起始索引。所以万一你的例子,你会得到&#34; a&#34;在&#34; BarackObama&#34;结束时。您可以尝试使用substring(int beginIndex, int endIndex)
。
答案 2 :(得分:0)
在这里。
private int indexOf(String s1,String s2){
int index=0;
if( s1 ==null || s2 ==null){
return -1;
}else if(s1.length()<s2.length()){
return -1;
}else{
index=s1.lastIndexOf(s2);
s1=s1.substring(0,index);
if(!s1.contains(s2)){
return index;
}else{
return indexOf(s1,s2);
}
}
}
答案 3 :(得分:0)
public int indexOf(String s1, String s2){
if (s1.length() < s2.length()){
return -1;
} else {
int n = 0;
int index = findIndex(s1, s2, n);
return index;
}
}
private int findIndex(String s1, String s2, int n){
if (s1.substring(n, (n + s2.length())).equals(s2)){
return n;
} else if ((n < s1.length() - s2.length())){
return findIndex(s1, s2, (n + 1));
} else{
return -1;
}
}