【发布时间】:2015-04-20 03:38:11
【问题描述】:
我正在尝试在 Java 中查找字符串的每个可能的字谜 - 我的意思是,如果我有一个 4 个字符长的单词,我想要从它派生的所有可能的 3 个字符长的单词,所有 2 个字符长的单词和所有 1 个字符长。我认为最直接的方法是使用两个嵌套的 for 循环并在字符串上进行迭代。这是我现在的代码:
private ArrayList<String> subsets(String word){
ArrayList<String> s = new ArrayList<String>();
int length = word.length();
for (int c=0; c<length; c++){
for (int i=0; i<length-c; i++){
String sub = word.substring(c, c+i+1);
System.out.println(sub);
//if (!s.contains(sub) && sub!=null)
s.add(sub);
}
}
//java.util.Collections.sort(s, new MyComparator());
//System.out.println(s.toString());
return s;
}
我的问题是它适用于 3 个字母的单词,fun 会产生这个结果(不要介意排序,这个单词已经过处理,所以我有一个按字母顺序排列的字符串):
f
fn
fnu
n
nu
u
但是当我尝试 4 个字母的单词时,它会遗漏一些东西,如 catq 给我的:
a
ac
acq
acqt
c
cq
cqt
q
qt
t
即,我没有看到 3 个字符的长词 act - 这是我在测试此方法时正在寻找的那个。我不明白问题出在哪里,这很可能是我在创建子字符串时犯的一个逻辑错误。如果有人可以帮助我,请不要给我它的代码,而是给我解决方案背后的原因。这是一门课程,我需要自己编写代码。
编辑:清除某些东西,对我来说 acq、qca、caq、aqc、cqa、qac 等是同一件事 - 为了更清楚,发生的是字符串按字母顺序排序,所以所有这些排列都应该作为一个唯一的结果出现,acq。所以,我不需要字符串的所有排列,而是给定一个 4 个字符长的字符串,我可以从中派生出所有 3 个字符长的字符串 - 这意味着一次取出一个字符并返回该字符串因此,对原始字符串中的每个字符都这样做。 我希望我已经让我的问题更清楚了
【问题讨论】:
-
这与查找power set 非常相似。有很多算法可以找到幂集,你应该研究一下。
-
也不适用于 3s。你有“fn”但没有“fu”
-
只是一个一般建议:逐步调试对于此类逻辑错误非常有帮助。
-
并非总是如此——逐步调试非常适合找出它为什么会做不应该做的事情。在找出为什么它没有做它应该做的事情时不太好。
-
Anagram 会比 substring 更好
标签: java string for-loop arraylist substring