问题描述:https://www.hackerrank.com/challenges/sherlock-and-anagrams
有人可以告诉我,我做错了什么吗?我的算法是:
以下是未通过的测试用例:
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;
}
}
}
答案 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 - l
或b = d + l
和a = c + l
存在。
在伪代码中,这看起来像这样:
b = d - l