Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使给定字符串成为回文_Java_Oop_Recursion_Palindrome - Fatal编程技术网

Java 使给定字符串成为回文

Java 使给定字符串成为回文,java,oop,recursion,palindrome,Java,Oop,Recursion,Palindrome,有人能讨论并解释一下我可以修改代码以适应这些测试用例的方法吗。。。我试图让我的程序通过替换一个单词中的一个字母来阻止该单词成为回文,从而使其成为回文 所需测试用例: Palindromes.isPalindrome2("cat", 'c') => true Palindromes.isPalindrome2("axaa", 'x') => true Palindromes.isPalindrome2("12bb", 'b') => true Palindromes.isPali

有人能讨论并解释一下我可以修改代码以适应这些测试用例的方法吗。。。我试图让我的程序通过替换一个单词中的一个字母来阻止该单词成为回文,从而使其成为回文

所需测试用例:

Palindromes.isPalindrome2("cat", 'c') => true
Palindromes.isPalindrome2("axaa", 'x') => true
Palindromes.isPalindrome2("12bb", 'b') => true
Palindromes.isPalindrome2("ca", 'c') => true
这就是我到目前为止所拥有的

public class Palindromes {

    public static boolean isPalindrome(String word) {
        //Strip out non-alphanumeric characters from string
        String cleanWord = word.replaceAll("[^a-zA-Z0-9]","");
        //Check for palindrome quality recursively
        return checkPalindrome(cleanWord);
    }

    public static boolean isPalindrome2(String word) {
        //Strip out non-alphanumeric characters from string
        String cleanWord = word.replaceAll("[^a-zA-Z0-9]","");
        //Check for palindrome quality recursively
        return checkPalindrome2(cleanWord);
    }

    public static boolean checkPalindrome(String word) {
        if(word.length() < 2) { 
            return true;  
        }
        char first  = word.charAt(0);
        char last   = word.charAt(word.length()-1);
        if(first != last) { 
            return false; 
        }
        else { 
            return checkPalindrome(word.substring(1,word.length()-1));
        }
    }

    public void replace(int first, int last) {
        if(first != last)
        { first = last;}
        else if(last != first) 
        { last = first;}
        }

    public static boolean checkPalindrome2(String word) {
        char special = 0;
        if(word.length() < 2) { 
            return true;  
        }
        char first  = word.charAt(0);
        char last   = word.charAt(word.length()-1);
        if(first != last) { 
            return false; 
        }
        if(first != last)
            return false; 
        else {
            return checkPalindrome2(word.substring(1,word.length()-1));
        }
    }
}

替换是我处理通配符的尝试,但我似乎找不到合适的解决方案。。。我们将非常感谢您的帮助。谢谢…

以下是我的步骤:

将收到的字符串拆分为2个子字符串。第一根弦的前半部是弦的前半部,第二根弦的后半部是弦的半端。 例如:

字符替换='c'; 字符串输入=aabbcc; StringBuilder front=新StringBuilderinput.substring0,input.length/2; //不要包含它镜像自身的奇数中间 StringBuilder back=new StringBuilderinput.substringinput.length/2+input.length%2; 比较两个字符串,如果其中一个匹配,则替换另一个不匹配。如果两者都不匹配且不是给定的“替换”字符,则返回false。如果您进行了多个替换,请返回false,因为这是您所说的要求 例如:

整数替换=0; 对于int i=0;i1 { //只能替换一个 返回false; } } } 字符串输出=front.toString+back.toString;
这是我的代码,它将输入分成两半,并将前半部分与后半部分进行比较。如果它们相等,则输入已经是回文。如果它们不相等,它将遍历前半部分,与要替换的输入字符交换字母,并在每一步与反向后半部分进行比较。然后它会做同样的事情,但使用下半部分而不是上半部分:

public class CanMakePalindrome {

    public static void main(String[] args) {
        System.out.println("cat using c: " + canMakePalindrome("cat", 'c'));
        System.out.println("axaa using x: " + canMakePalindrome("axaa", 'x'));
        System.out.println("12bb using b: " + canMakePalindrome("12bb", 'b'));
        System.out.println("ca using c: " + canMakePalindrome("ca", 'c'));
    }

    private static boolean canMakePalindrome(String input, char c) {
        int length = input.length();
        String start = input.substring(0, length/2);
        String end = input.substring(length/2+length%2, length); // need modulus in the case of odd length input

        return (replaceLoop(start,end, c) || replaceLoop(end,start, c));
    }

    private static boolean replaceLoop(String start, String end, char c) {
        if (start.equals(reverse(end))) {
            System.out.println("Input is already a palindrome.");
            return true;
        }

        for (int i=0; i<start.length(); i++) {
            char[] startchars = start.toCharArray();
            char[] endchars = end.toCharArray();
            endchars = reverse(endchars);
            startchars[i] = c;
            if ((new String(startchars).equals(new String(endchars)))) return true;
        }

        return false;
    }

    private static char[] reverse(char[] input) {
        int length = input.length;
        char[] reversed = new char[length];
        for (int i=0;i<length;i++) {
            reversed[length-i-1]=input[i];
        }
        return reversed;
    }

    private static String reverse(String input){
        String reversed = new String(reverse(input.toCharArray())); 
        return reversed;
    }

}

请注意,12bb不能仅使用一个字符更改就变成回文,因此您的测试用例似乎与仅替换一个字母的规范不匹配。如果输入一个空字符串,我的代码也将返回true。

这听起来像是家庭作业。无论如何。。。这个案例“Palindromes.isPalindrome212bb”不是假的吗?或者我忽略了一个替换,它以相同的方式前后读取数据?程序应该用b和b替换1和2。对于一个,替换方法修改局部变量。您需要一种更好的设置变量的方法,一个简单的解决方案是返回一对object@justderb... 嗯,好吧,祝你好运:等等。。。我刚刚意识到,如果它正在寻找所有可能的替换字符,那么只要用替换字符替换字符串中的每个字符,您就会成功!我怀疑你误解了你的任务。更可能的情况是,您应该寻找替换特定角色的所有实例,或者仅替换其一个实例。同样,‘Palindromes.isPalindrome212bb’b应该返回false。
cat using c: true
axaa using x: true
12bb using b: false
ca using c: true