【问题标题】:How to maximize the result of multiplying lengths of the two strings without common characters如何最大化没有公共字符的两个字符串的长度相乘的结果
【发布时间】:2013-11-22 03:12:55
【问题描述】:

给定一个单词列表,找到两个字符串ST,这样:

  1. ST 没有共同特征
  2. S.length() * T.length() 已最大化

我的方法是,首先为每个字符串构建位图并尝试找到最大乘数。你能给我一个时间复杂度小于 O(n2) 的更好的算法吗?

public class biggest_multiply {
    int biggest(String[] array){
        if(array==null||array.length<=1)
            return 0;
        class bitMap{
            int bit;
            String s;
        }
        bitMap[] bm=new bitMap[array.length];
        for(int i=0;i<array.length;i++){
            bm[i]=new bitMap();
            for(int j=0;j<array[i].length();j++)
                bm[i].bit=bm[i].bit|(1<<(array[i].charAt(j)-'a'));
            bm[i].s=array[i];
        }
        int maximum=0;
        for(int i=0;i<array.length;i++){
            for(int j=i+1;j<array.length;j++)
                if((bm[i].bit&bm[j].bit)==0)
                    maximum=Math.max(maximum, bm[i].s.length()*bm[j].s.length());
        }
        return maximum;
    }
    public static void main(String[] args){
        System.out.println(new biggest_multiply().biggest(new String[]{"aa","aabb","bb","cc"}));
    }
}

【问题讨论】:

  • 至少尝试一下自己的作业问题。
  • 这不是作业..我在网上看到它并认为这是一个有趣的问题。我只能想到为每个字符串的字符制作哈希集或位图并一一比较。但是,找到最大化的乘法结果成本 O(n^2)...
  • 这很难。元素区别问题告诉我们,我们无法确定两个单词是否在优于 O(m lg m) 的时间内没有共同字符(假设平均单词长度为 m)。对于摊销情况,也许有更好的算法,但我不知道。我们可以使用哈希表在 O(m) 时间内“打破”这个边界,但这假设了一个恒定时间的哈希函数,等等。

标签: arrays string algorithm


【解决方案1】:

按 word.length() 降序对单词进行排序,因此可以进行短路以加快速度。但仍然是 O(n^2)。

if (bm[i].s.length() * bm[j].s.length() <= max)
    break;

if ((bm[i].bit & bm[j].bit)==0) {
    maximum=Math.max(maximum, bm[i].s.length()*bm[j].s.length());
    break;
}

【讨论】:

    【解决方案2】:

    一个直接的解决方案是尝试 S & T 中所有可能的单词匹配。运行时间为 O(n*m),其中 n 是单词的数量,m 是单词的大小。

    更好的方法是在迭代之前预先计算每个单词中的字符映射和大小。运行时间将减少到 O(n)。

    【讨论】:

    • 不会尝试所有可能的单词匹配 O(n^2 m^2) 吗?遍历所有单词一次将是 O(nm)。每个单词都有一个字符映射,然后将其减少到 O(n^2 m)。此解决方案似乎与用户在上面的评论中建议的解决方案相同。
    猜你喜欢
    • 1970-01-01
    • 2019-05-03
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2020-11-13
    相关资源
    最近更新 更多