Hackerrank:Sherlock和Anagrams(在Strings部分中等)

时间:2015-10-03 17:01:03

标签: java string algorithm data-structures

问题描述:https://www.hackerrank.com/challenges/sherlock-and-anagrams

有人可以告诉我,我做错了什么吗?我的算法是:

  1. 输入字符串; STR
  2. 从长度i = 1到str.length-2
  3. 生成模式字符串
  4. 检查str.substring(i + 1)
  5. 中是否存在模式字符串的字谜

    以下是未通过的测试用例:

    input-string   My OP   Expected OP
    ifailuhkqq     2         3
    

    我的代码:

    public class SherlockandAnagrams
    {
        static int count = 0;
    
        public static void main(String[] args)
        {
            Scanner sc = new Scanner(System.in);
            generatePairs(sc.next());
            int len = 1;
        }
    
        public static void generatePairs(String str)
        {
            int len = 1;
            //int i=0;
            while (len < str.length())
            {
                for (int i = 0; i + len <= str.length(); i++)
                    findAnagramPairs(str, len, str.substring(i, i + len), i + 1);
                len++;
            }
            System.out.println(count);
        }
    
        private static void findAnagramPairs(String str, int len, String pattern, int p)
        {
            int i = p;
            while (i + len <= str.length())
            {
                if (checkAnagram(pattern, str.substring(i, i + len)))
                {
                    count++;
                }
                i++;
            }
        }
    
        private static boolean checkAnagram(String pattern, String text)
        {
            if (pattern.length() == 1)
            {
                if (pattern.equals(text))
                    return true;
                else
                    return false;
            }
            else
            {
                int i = 0;
                int j = pattern.length() - 1;
                while (i < pattern.length())
                {
                    if (pattern.charAt(i) == text.charAt(j))
                    {
                        i++;
                        j--;
                    }
                    else
                        return false;
                }
                return true;
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

问题的一个更简单的解决方案如下:
如果存在(n , m)长度为l的另一对,则只有l - 1(n or n - 1 or n + 1 , m or m - 1 or m - 1)的起始索引的anagramic对才能存在。因此,我们可以轻松地将蛮力的效率降低到更有效的解决方案。

一个例子:

        A B C B A A B C A
len 1   A       A A     A //all pairs containing A
len 2   A B   B A         //all pairs that match A B or its reverse
len 3   A B C B A         //all pairs that match A B C or its reverse

OR

        A B C B A A B C A
len 1     B   B     B     //all pairs containing B
len 2     B C B     B C   //all pairs that match B C or its reverse
len 3   A B C B A A B C   //all pairs that match A B C or its reverse

这同样适用于任何其他长度为l的对,并且它与长度为l + 1的匹配对。一般情况下,如果存在两对l + 1(a , b)长度为(c , d)的{​​{1}}和{{1},则只存在一对l长度a = c - lb = d + la = c + l存在。

在伪代码中,这看起来像这样:

b = d - l