【发布时间】:2020-07-07 02:35:21
【问题描述】:
我有一个程序可以计算两个字符串是否是字谜。 它适用于长度小于 10 的字符串输入。 当我输入两个长度相等且长度超过 10 次的字符串时,程序运行并没有产生答案。
我的概念是,如果两个字符串是字谜,一个字符串必须是另一个字符串的排列。
这个程序从一个字符串生成所有排列,然后它检查另一个字符串是否有任何匹配的排列。在这种情况下,我想忽略案例。 如果没有找到匹配的字符串或比较的字符串长度不相等,则返回false,否则返回true。
public class Anagrams {
static ArrayList<String> str = new ArrayList<>();
static boolean isAnagram(String a, String b) {
// there is no need for checking these two
// strings because their length doesn't match
if (a.length() != b.length())
return false;
Anagrams.permute(a, 0, a.length() - 1);
for (String string : Anagrams.str)
if (string.equalsIgnoreCase(b))
// returns true if there is a matching string
// for b in the permuted string list of a
return true;
// returns false if there is no matching string
// for b in the permuted string list of a
return false;
}
private static void permute(String str, int l, int r) {
if (l == r)
// adds the permuted strings to the ArrayList
Anagrams.str.add(str);
else {
for (int i = l; i <= r; i++) {
str = Anagrams.swap(str, l, i);
Anagrams.permute(str, l + 1, r);
str = Anagrams.swap(str, l, i);
}
}
}
public static String swap(String a, int i, int j) {
char temp;
char[] charArray = a.toCharArray();
temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
return String.valueOf(charArray);
}
}
1.我想知道为什么这个程序不能处理更大的字符串
2.我想知道如何解决这个问题
你能猜到吗?
【问题讨论】:
-
如果你有一个由 11 个阶乘排列组成的字符串,它是 39916800 大数,对吗?它正在处理它,你最终会在控制台上弹出结果
-
1) 您的解决方案的时间和空间复杂度很大。因为有n!排列,其中
n是字符串的长度。 2)你可以检查两个字符串是否是线性时间和恒定空间复杂度的字谜。 -
@AbhinavChauhan 是的,我知道我总是像这些大递归一样卡住,有没有一种机制可以消除这样的问题
-
@jpact 那么有没有一种机制可以处理这种情况?
-
@NemindaPrabhashwara 请参阅下面的解决方案
标签: java algorithm time-complexity permutation anagram