问题描述: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;
}
}
}
这个问题的一个更简单的解决方案是:
起始索引为(n,m)
且长度为L
的anagramic对只能存在,如果存在另一对长度为(n或n-1或n+1,m或m-1或m-1)
且长度为l-1
(n或n-1或n+1,m或m-1或m-1)
的anagramic对。因此,我们可以很容易地将效率从bruteforce降低到一个更有效的解决方案。
一个例子:
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
或
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
set pairs = listAnagrams(input , 1)
int len = 1
while NOT pairs.isEmpty()
set next_len
//generate pairs with length len + 1
for pair p in pairs
pair left = pair(p.a - len , p.b + len)
pair right = pair(p.a + len , p.b - len)
if pairs.contains(left)
next_len.add(pair(p.a , left.b)
if pairs.contains(right)
next_len.add(pair(left.a , p.b)
pairs = next_len
++len
字符串是一系列的字符,比如说 "hello, world"或者 "albatross"。Swift 的字符串用String类型来表示。String的内容可以通过各种方法来访问到,包括作为Character值的集合。 Swift 的 String 和 Character 类型提供了一种快速的符合 Unicode 的方式操作你的代码。字符串的创建和修改语法非常轻量易读,使用与 C 类似的字符串字面
本页包含内容: 字符串字面量 初始化空字符串 字符串可变性 字符串是值类型 使用字符 计算字符数量 连接字符串和字符 字符串插值 比较字符串 字符串大小写 Unicode String是例如"hello, world","海贼王"这样的有序的Character(字符)类型的值的集合,通过String类型来表示。 Swift 的String和Character类型提供了一个快速的,兼容 Unicod
问题内容: 我正在尝试找到这个问题的第三种解决方案。 我不明白为什么这个不打印。 当然,由于使用字符串实习,被修改的实例与?方法中使用的实例完全相同。 我想念什么? 编辑 @yshavit有趣的一点是,如果您添加该行 在之前,输出为 问题答案: 可以说这是HotSpot JVM错误。 问题在于字符串字面量的内部机制 。 在常量池解析期间,将懒惰地创建字符串文字的实例。 最初,字符串常量在常量池中由
问题内容: 与使用循环相比,在Python中是否有一种更惯用的方式来计算字符串长度? 我试过了,但只适用于整数: 问题答案: 我知道这是一个老问题,但是我不禁注意到Python错误消息 告诉 您如何执行此操作: 所以:
问题内容: 我想从一个字符中删除一部分字符串,即: 源字符串: 目标字符串: 问题答案: 有多种方法可以做到这一点。如果您有要替换的字符串,则可以使用该类的或方法。如果您要替换子字符串,则可以使用API 获得该子字符串。 例如 要替换“()”中的内容,可以使用:
问题内容: 以下语句, 产生输出。 但是,以下内容 产生。 区别在哪里? 问题答案: 您会因为操作符优先级和字符串转换的结合而看到此行为。 JLS 15.18.1 指出: 如果只有一个操作数表达式的类型为String,则对另一操作数执行字符串转换(第5.1.11节),以在运行时生成字符串。 因此,第一个表达式中的右侧操作数将隐式转换为字符串: 但是对于第二个表达式,必须将复合赋值运算符与一起考虑。