【问题标题】:Fastest way to calculate all the substrings of a string and check it for a given condition计算字符串的所有子字符串并检查给定条件的最快方法
【发布时间】:2015-06-20 22:22:57
【问题描述】:

计算给定字符串的所有可能子字符串并检查它们是否满足以下条件的最快方法是什么。

条件是: 如果生成的子字符串的第一个和最后一个字符相同,则 count 加一。我们需要找到给定非常大字符串的所有这些可能的子字符串。

我尝试过天真的蛮力方法,但它不适用于长度为 10^7 的字符串。 请帮忙:(

for(int c = 0 ; c < length ; c++ )
        {
            for( i = 3 ; i <= length - c ; i++ )
            {
                String sub = str.substring(c, c+i);
                System.out.println(sub);
                if(sub.charAt(0) == sub.charAt(sub.length()-1)){
                    count++;
                }
            }
        }

【问题讨论】:

  • 当你只需要第一个和最后一个字符时,为什么要生成子字符串?既然你可以计算每个字符被复制了多少次,你为什么还要这样做呢?

标签: java string


【解决方案1】:

您当前的解决方案是输入字符串大小的二次方或 O(n^2)

您可以通过计算字符串中每个字符的出现次数,然后计算可以使用该字符创建的子字符串的数量来更有效地解决这个问题。

例如如果一个字符出现 4 次,那么这将导致 3 + 2 + 1 = 6 个子字符串。

您可以使用以下公式:((n-1) * n) / 2

这将算法的复杂度降低到 O(n),因为要计算每个字符,您只需遍历字符串一次。

我相信这段代码应该可以工作:

public static void main(String[] args) {
    String str = "xyzxyzxyzxyz";
    Map<Character, Integer> map = new HashMap<>();
    for (char c : str.toCharArray())
    {
        Integer count = map.get(c);
        if (count == null)
            count = 0;
        map.put(c, count + 1);
    }
    int sum = 0;
    for (int n : map.values())
        sum += ((n - 1) * n) / 2;
    System.out.println(sum);
}

【讨论】:

  • 嗨!感谢您的帮助:) 由于我是初学者,您能帮我写代码吗?
  • ...它们被称为三角数。
  • 即将发布完全相同的答案.. 然后看到你的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
相关资源
最近更新 更多