在下面的代码中,我面临的问题是如何使内循环从给定的索引开始而不是每次都为0。
逻辑:
substr = rohan;
mainstr = herohanda
代码首先使用substr
的每个字符检查'r'
的第一个字符,即mainstr
,直到找到匹配为止。当找到匹配时,程序返回外部循环并递增i
以检查substr
的第二个charcater(即o
)是否与下一个字符(索引旁边的字符)匹配'r'
找到mainStr
的匹配项的位置)。问题是如何从下一个字符开始内循环。这里每次都以初始索引(0)开始。
CODE:
public class SubstringInString {
public static void isSubstring(String subStr, String mainStr){
int flag = 0;
int counter = 0;
OUTER: for(int i = flag; i<subStr.length(); i = i+flag){
INNER: for(int j = 0; j< mainStr.length(); j=counter ){
if(subStr.charAt(i) == mainStr.charAt(j)){
counter++;
flag++;
continue OUTER;
}
else
{
if((mainStr.length() - i) >= subStr.length()){
counter ++;
flag = 0;
continue INNER;
}
else{
System.out.println("Main String does not contain the substring");
}
}
}
}
// System.out.println("Match found at " + j-subStr.length());
}
}
请告诉我如何解决这个问题,以及是否有更好的方法来解决这个问题。 提前致谢
答案 0 :(得分:1)
从技术上讲,这解决了这个问题:
public static void isSubstring(String subStr, String mainStr){
return mainStr.matches(".*\\Q" + subStr + "\\E.*");
}
答案 1 :(得分:1)
假设我们想知道s2
是否是s1
的子字符串。
有2个基本案例:
s2
的长度为0:在这种情况下,我们可以返回true
。s2
的长度超过s1
的长度:我们可以返回false
。一般方法如下:遍历s1
的每个字符,看它是否与s2
的第一个字符匹配。如果是,请检查s1
的其余字符是否与s2
的其他字符匹配。如果是,请返回true
。如果完全探索s1
但未找到匹配项,请返回false
。
以下是Java中的样子:
static boolean isSubstring(String s1, String s2){
int n1 = s1.length();
int n2 = s2.length();
if(n2 == 0) // Base Case 1
return true;
if(n2 > n1) // Base Case 2
return false;
for(int i = 0; i < s1.length(); i++)
if(s1.charAt(i) == s2.charAt(0)) // if first char matches
if(isRestMatch(i+1, s1, s2)) // check if rest match
return true;
return false;
}
static boolean isRestMatch(int start, String s1, String s2){
int n = s2.length();
for(int i = start, x = 1; i < n; i++, x++)
if(s1.charAt(i) != s2.charAt(x))
return false;
return true;
}
答案 2 :(得分:0)
public String strStr(String haystack, String needle) {
int needleLen = needle.length();
int haystackLen = haystack.length();
if (needleLen == haystackLen && needleLen == 0)
return "";
if (needleLen == 0)
return haystack;
for (int i = 0; i < haystackLen; i++) {
// make sure in boundary of needle
if (haystackLen - i + 1 < needleLen)
return null;
int k = i;
int j = 0;
while (j < needleLen && k < haystackLen && needle.charAt(j) == haystack.charAt(k)) {
j++;
k++;
if (j == needleLen)
return haystack.substring(i);
}
}
return null;
}