我正在寻找一种有效的算法,它可以为我提供最长的字符串,可以从字符串列表中创建。更确切地说:
如果文件包含大量字符串,请从文件中显示的字符串列表中找到最长的字符串,这是其他一个或多个字符串的串联。
注意:答案字符串也应该属于文件中的字符串列表。
示例输入:
The
he
There
After
ThereAfter
输出:
ThereAfter
答案 0 :(得分:2)
按列表中字符串的降序排序列表(列表中的第一个是最长的字符串)。 Quicksort以平均时间复杂度O(nlogn)进行排序。
然后,迭代从左侧开始的列表中的字符串。
从字符串S开始,迭代元素s到右边。如果s是S的子字符串,则从S中删除s。继续向右迭代,直到S为空,这意味着它由列表中的项组成。
public static class ListCompare implements Comparator<String> {
public int compare(String s1, String s2) {
if (s1.length() < s2.length())
return 1;
else if (s1.length() > s2.length())
return -1;
else
return 0;
}
}
public static String longestSurString(String[] ss) {
Arrays.sort(ss, new ListCompare ());
for (String S: ss) {
String b = new String(s);
for (String s: ss) {
if (!s.equals(b) && S.contains(s)) {
S = S.replace(s, "");
}
}
if (S.length() == 0)
return b;
}
return null;
}
答案 1 :(得分:1)
让我们为S1, S2, ..., Sn
如果我正确理解问题陈述,而不是Si
作为答案的候选者,它必须等于某些句子的连接
Sj_1, Sj_2, ..., Sj_k
其中forall x in 1..k: i != j_x
。那就是Si
必须是它不是成员的字符串子集的串联。
鉴于此,将所有字符串添加到trie。这将找到所有前缀对,即上面的所有(Si, Sj_1)
。从Sj_1
移除Si
前缀会生成一个新字符串T
,该字符串必须等于Sj_k
,或者可以通过搜索Sj_2
来同样减少特里。
答案 2 :(得分:1)
使用Trie&amp; amp;的最佳解决方案HashMap数据结构:
我们需要首先存储所有字符串然后只检查前缀哪个字长度更多。
public class TrieNode {
private HashMap<Character, TrieNode> children;
private boolean isWord;
public TrieNode() {
children = new HashMap<>();
isWord = false;
}
public void add(String s) {
HashMap<Character,TrieNode> temp_child = children;
for(int i=0; i<s.length(); i++){
char c = s.charAt(i);
TrieNode trieNode;
if(temp_child.containsKey(c)){
trieNode = temp_child.get(c);
}else{
trieNode = new TrieNode();
temp_child.put(c, trieNode);
}
temp_child = trieNode.children;
//set leaf node
if(i==s.length()-1)
trieNode.isWord = true;
}
}
public boolean isWord(String s) {
TrieNode trieNode = searchNode(s);
if(trieNode != null && trieNode.isWord)
return true;
else
return false;
}
public TrieNode searchNode(String s){
HashMap<Character, TrieNode> temp_child = children;
TrieNode trieNode = null;
for(int i=0; i<s.length(); i++){
char c = s.charAt(i);
if(temp_child.containsKey(c)){
trieNode = temp_child.get(c);
temp_child = trieNode.children;
}else{
return null;
}
}
return trieNode;
}