【问题标题】:Hackerrank - Solving Palindrom Index SolutionHackerrank - 解决回文索引解决方案
【发布时间】:2021-12-28 19:54:38
【问题描述】:

问题:

给定一个范围为 ascii[a-z] 的小写字母字符串,确定要删除的字符索引以将字符串更改为回文。如果字符串无法转换为回文或已经是回文,则返回 -1 否则返回要删除的字符的索引。

我的解决方案:

public static int palindromeIndex(String s) {

    if(p(s)){
        return -1;
    }

    StringBuilder sb = new StringBuilder(s);

    for(int i=0; i<s.length(); i++){

        sb.deleteCharAt(i);
        if(p(sb.toString())){
            return i;
        }
        sb.insert(i,s.charAt(i));
    }


    return -1;

}

private static boolean p(String s){

    for(int i=0; i<s.length()/2; i++){
        if(s.charAt(i) != s.charAt(s.length() - i - 1)){
            return false;
        }
    }

    return true;
}

根据hackerrank,以下一个或所有测试用例失败(无法确定是哪一个):

  1. quyjjdcgsvvsgcdjjyq
  2. hgygsvlfwcwnswtuhmyaljkqlqjjqlqkjlaymhutwsnwcflvsgygh
  3. fgnfnidynhxebxxxfmxixhsruldhsaobhlcggchboashdlurshxixmfxxxbexhnydinfngf
  4. bsyhvwfuesumsehmytqioswvpcbxyolapfywdxeacyuruybhbwxjmrrmjxwbhbyuruycaexdwyfpaloyxbcpwsoiqtymhesmuseufwvhysb
  5. fvyqxqxynewuebtcuqdwyetyqqisappmunmnldmkttkmdlnmnumppasiqyteywdquctbeuwenyxqxqyvf
  6. mmbiefhflbeckaecprwfgmqlydfroxrblulpasumubqhhbvlqpixvvxipqlvbhqbumusaplulbrxorfdylqmgfwrpceakceblfhfeibmm
  7. tpqknkmbgasitnwqrqasvolmevkasccsakvemlosaqrqwntisagbmknkqpt
  8. lhrxvssvxrhl
  9. prcoitfiptvcxrvoalqmfpnqyhrubxspplrftomfehbbhefmotfrlppsxburhyqnpfmqlaorxcvtpiftiocrp
  10. kjowoemiduaaxasnqghxbxkiccikxbxhgqnsaxaaudimeowojk

我的输出:

  1. 1
  2. 8
  3. 33
  4. 23
  5. 24
  6. 43
  7. 20
  8. -1
  9. 14
  10. -1

我在本地调试代码,根据我的理解,这个测试用例运行良好。请帮我解释一下,代码有什么问题。

注意:我可以用其他替代方法(更简单的方法)来解决,在线提供解决方案,但我试图了解我的一段 java 代码有什么问题。谢谢。

【问题讨论】:

  • 你可以用一种更简单的方式来做到这一点:修改回文测试,以便在双向扫描时计算不匹配,并且只容忍一个(你可以使用索引来达到这个目的)。
  • 您的代码通过了提交! ..但未通过测试用例 7、12、14,原因是:超时!所以它看起来“正确”!但可能会“更有效率”! ;)
  • 尝试“线性”算法以支持“二次”算法... (-> discussions)

标签: java algorithm logic reverse palindrome


【解决方案1】:

您的代码在某些测试用例上超时。尝试删除每个字符然后检查是否为回文,效率不高。

通过首先检查原始字符串是否是回文,您可以找到它失败的地方,这使您只有两种删除的可能性。所以你只需要尝试这两个。此外,您实际上不必执行删除。您可以跳过相关字符并通过跳过相应的索引继续进行回文检查。

这是一个可能的实现:

    public static int palindromeIndex(String s) {
        int start = 0;
        int end = s.length() - 1;
        while (start < end && s.charAt(start) == s.charAt(end)) {
            start++;
            end--;
        }
        if (start >= end) return -1; // already a palindrome
        // We need to delete here
        if (isPalindrome(s, start + 1, end)) return start;
        if (isPalindrome(s, start, end - 1)) return end;
        return -1;
    }

    public static boolean isPalindrome(String s, int start, int end) {
        while (start < end && s.charAt(start) == s.charAt(end)) {
            start++;
            end--;
        }
        return start >= end;        
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多