给出以下字符串集:
are yo
you u
how nhoware
alan arala
dear de
我需要找到一个可以通过连接任一列中的字符串来构造的序列,并且在两种情况下都必须使用相同数量的元素。
例如,“dearalanhowareyou”可以从两组字符串构造,每次使用5个元素。
无效的选择是“dearalanhoware”,因为它会使用左栏中的4个元素,但是右边只有3个元素
问题来自这里:
https://open.kattis.com/problems/correspondence
我正在使用这个网站来改善未来的求职面试,而我似乎无法想象这一点。
我唯一的工作实现是采用强力方法,采用每组的每种可能组合,由于时间复杂性,这不是一个非常好的解决方案。
我的代码现在:
list1 = getPermutations("",send1);
list2 = getPermutations("",send2);
ArrayList<String> duplicateValues = new ArrayList<String>();
for (int i = 0; i < list1.size(); i++) {
if (list2.contains(list1.get(i))) {
duplicateValues.add(list1.get(i));
}
private static ArrayList<String> getPermutations(String currentResult, ArrayList<String> possibleChars) {
ArrayList<String> result = new ArrayList<>(possibleChars.size());
for (String append : possibleChars) {
String permutation = currentResult + append;
result.add(permutation);
if (possibleChars.size() > 0) {
ArrayList<String> possibleCharsUpdated = (ArrayList) possibleChars.clone();
possibleCharsUpdated.remove(new String(append));
result.addAll(getPermutations(permutation, possibleCharsUpdated));
}
}
return result;
}
答案 0 :(得分:0)
您可以通过查找每个集合中哪些单词可能开始构造的字符串来显着缩小您需要检查的排列量。在这种情况下,只有两个选项是亲爱的和 de ,因为 de 是 dear 的子字符串。一旦你开始使用String,你可以获取较长String的子字符串,在这种情况下"dear".substring("de".length())
返回 ar ,它告诉你右边的下一个元素需要以 AR 。所以基本上你有两种情况:
String stringLeft = "", stringRight = "";
if(stringLeft.length() == stringRight.length())
{
//find two matching Strings here (one is substring of another)
String[] matching = getMatching(); //returns 1d array of size 2(if only two strings match)
stringLeft += matching[0];
stringRight += matching[1];
}
else
{
if(stringLeft.length() > stringRight.length())
{
String start = stringLeft.substring(stringRight.length());
//find string on right that starts with start
stringRight += getStringStartingWith(start);
}
else
{
String start = stringRight.substring(stringLeft.length());
//find string on left that starts with start
stringLeft += getStringStartingWith(start);
}
}
您唯一需要注意的是,是否存在多个匹配的字符串,或者以您要查找的子字符串开头的字符串。