可以从字符串列表中生成的最长字符串

时间:2013-04-27 16:16:09

标签: algorithm data-structures concatenation

我正在寻找一种有效的算法,它可以为我提供最长的字符串,可以从字符串列表中创建。更确切地说:

如果文件包含大量字符串,请从文件中显示的字符串列表中找到最长的字符串,这是其他一个或多个字符串的串联。

注意:答案字符串也应该属于文件中的字符串列表。

示例输入:

The
he
There
After
ThereAfter

输出:

ThereAfter

3 个答案:

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