识别循环词

时间:2014-04-17 17:01:31

标签: java string boolean string-length cyclic

我能够弄清楚为什么我的琴弦没有被测试。我没有在我的主要调用方法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;
}

}

2 个答案:

答案 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
}