当前位置: 首页 > 知识库问答 >
问题:

Hackerrank:夏洛克和字谜(中度在字符串部分)

颛孙正谊
2023-03-14

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

谁能告诉我我做错了什么?我的算法是:

  1. 输入字符串;STR
  2. 生成从length i=1到str.length-2的模式字符串
  3. 检查str.substring(i+1)中是否存在模式字符串的字谜
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个答案

隗俊誉
2023-03-14

这个问题的一个更简单的解决方案是:
起始索引为(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节),以在运行时生成字符串。 因此,第一个表达式中的右侧操作数将隐式转换为字符串: 但是对于第二个表达式,必须将复合赋值运算符与一起考虑。