【问题标题】:How to inteligently concat two strings so as to ignore duplicate substring如何智能地连接两个字符串以忽略重复的子字符串
【发布时间】:2011-11-19 18:15:49
【问题描述】:

我想智能地连接用户输入,以便它以下列方式删除重复的子字符串。

  • 不安+容易=不安
  • concat + 催化剂 = concatalyst

这是我正在尝试做的,但无法弄清楚缺少什么

public class Concater {
    public String concat(String s1, String s2) {

        String s = s1;
        int L = s2.length();
        while (L > 0) {
            String common = s2.substring(0, L);
            if (s1.endsWith(common)) {
                s = s1+common+s2.substring(L);
                break;
            }
            L--;
        }

        return s;
    }

    public static void main(String[] args) {
        Concater c = new Concater();
        System.out.println(c.concat("uneasy", "easyly")+"|expected:uneasyly");
        System.out.println(c.concat("concat", "catalyst")+"|expected:concatalyst");
    }

}

输出

uneasyeasyly|expected:uneasyly
concatcatalyst|expected:concatalyst

有更好的方法吗?

【问题讨论】:

    标签: java string-concatenation


    【解决方案1】:

    你的错误就在这行

    s = s1+common+s2.substring(L);
    

    您正在连接整个 s1 加上已包含在 s1 中的公共部分。尝试将其更改为

    s = s1+s2.substring(L);
    

    它应该可以工作(但未经测试)。

    【讨论】:

    • 一定会喜欢有人在你写答案的时候发布完全相同的东西......干得好人:)
    • 谢谢你能告诉我是否有更好的连接方法吗?
    【解决方案2】:
     s = s1+common+s2.substring(L);
    

    问题是 common 已经包含在 s1 中。这就是你得到两个公共字符串的原因。

    但是,您的算法在更常见的情况下不起作用 uneasyly + easytogo = uneasylytogo

    【讨论】:

    • 您有什么建议吗?
    • 如此接近你所得到的,你真的需要自己尝试一下。
    【解决方案3】:

    这一行是你的问题:

    s = s1+common+s2.substring(L);
    

    应该是:

    s = s1+s2.substring(L);
    

    由于您要求更好的方法来执行此操作,因此迭代字符可能会更快:

    int i = 0;
    for ( s1Length = s1.length; i < s1.length(); i++ ) {
        if ( s1.charAt( i ) == s2.charAt( 0 ) {
            boolean matches = true;
            for ( int j = i, k = 0, remaining = s1.length - i; k < remaining; k++, j++ ) {
                if ( s1.charAt( j ) == s2.charAt( k ) ) {
                    matches = false;
                    break;
                }
            }
            if ( matches ) {
                break;
            }
        }
    }
    s = s1.substring( 0, i ) + s2;
    

    请注意,这是未经测试的,但可以通过算法...


    又想到一件事,如果您在执行此操作之前比较 1 的长度和 2 的长度,您可以通过选择在外循环中迭代哪个来提高效率。例如,如果 s2 比 s1 短,您可以通过在外循环中使用 s2 从 2 个字符串的末尾向后迭代来看到性能改进(无论多么轻微)。可能不值得,但您要求提供更多建议...

    【讨论】:

    • @hiran,我添加了一个建议的算法供您查看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    相关资源
    最近更新 更多