我能够弄清楚为什么我的琴弦没有被测试。我没有在我的主要调用方法isCyclicWord。一旦我添加了打印语句信息,我的程序就完美了!这是更新的代码。
public static void main (String [] args) {
String s1="picture";
String s2="icturep";
System.out.println (isCyclicWord(s1,s2));
}
public static Boolean isCyclicWord(String s1, String s2) {
if (s1.equals(s2))
return false;
for(int i = 0; i < s1.length(); i++)
if ((s1.substring(i) + s1.substring(0, i)).equals(s2))
return true;
return false;
}
}
答案 0 :(得分:1)
您不需要执行该循环。你可以简单地测试这样的循环字符串:
public Boolean IsCyclicWord(String s1, String s2) {
return s1.length() == s2.length() && (s1 + s1).contains(s2);
}
这是如何工作的:考虑你的例子:
s1 = "picture";
s2 = "icturep";
对于循环字符串,一个字符串的第一个字符位于另一个字符串之间,从那里开始,所有其他字符的顺序相同。当序列结束时,它会开始。所以,就像从字符串的开头到结尾附加半部分一样。那肯定会包含另一个字符串。
答案 1 :(得分:0)
Rohit Jain给了你一个非常简单的答案,似乎有效。但是,如果你想看到一堆代码,我已经创建了一个循环检查器,让你知道如何使用一堆循环来实现它。
public static Boolean isCyclicWord(String s1, String s2) {
int l = s1.length();
if (l != s2.length()) return false; // invalid length
if (s1.toString().equals(s2.toString())) return true; // exact match
char c = s1.charAt(0);
ArrayList<Integer> f = new ArrayList<Integer>();
for (int i = l - 1; i > -1; i--)
if (s2.charAt(i) == c) f.add(i);
if (f.isEmpty()) return false; // no first letter match
int n = f.size() - 1; //iterate through every first letter match
for (; n > -1; n--) {
for (int i = 0; i < l; i++) {
if (f.get(n) + i >= l) f.set(n, 0 - i); //start from beginning if read end
if (s2.charAt(f.get(n) + i) != s1.charAt(i)) break;
if (i == l - 1) return true; // cyclic match!
}
}
return false; // cyclic word not found
}