Java Pallindrome字符串替换为*字符

Java Pallindrome字符串替换为*字符,java,string,substring,Java,String,Substring,输入一个包含一些回文子字符串的字符串。找出回文子串(如果存在)的位置,并将其替换为*。例如,如果输入字符串是“bob有一个雷达平面”,那么它应该转换为“**有一个******平面” 我的代码如下 import java.util.Scanner; public class Pallindrome_String { public static void main(String[] args) { // TODO Auto-generated method stub

输入一个包含一些回文子字符串的字符串。找出回文子串(如果存在)的位置,并将其替换为*。例如,如果输入字符串是“bob有一个雷达平面”,那么它应该转换为“**有一个******平面”

我的代码如下

import java.util.Scanner;

public class Pallindrome_String {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);

        String sen;
        System.out.println("Enter the String: ");
        sen = in.nextLine();
        pallindrome(sen);

        in.close();
    }

    public static void pallindrome(String s) {
        int len = s.length();

        for (int i = 0; i < len; i++) {
            String res = "";
            if (s.charAt(i) == ' ') {
                res = s.substring(0, i);
                String rev = "";
                for (int j = res.length() - 1; j >= 0; j--) {
                    rev = rev + res.charAt(i);
                }
                if (rev.equals(res)) {
                    rev = "*";
                    System.out.print(rev + " ");
                } else {
                    System.out.print(res + " ");
                }
            }    
        }           
    }
}

有一种更简单、更有效的方法可以在Java中查找回文。我将解释实现它的步骤

首先,在获得输入“sen”后,可以使用String类的split方法来分隔每个单词

sen = in.nextLine();
String[] splitted = s.split(" "); // seperates the string when there is a whitespace and stores the resulting words in an array
将单词放入数组后,可以检查每个单词是否为回文。为此,您可以前后阅读单词,并比较结果


如果找到回文,将其索引位置存储在“拆分”数组中。完成“拆分”数组中的所有单词后,可以根据单词的长度打印出适当数量的*

拆分将在源字符串中释放双空格和标点符号,并在内存中生成大量无用对象。这是更正确的解决方案。伊姆霍

public static void main(String[] args) {
    String s = "Bob! Do you have a radar plane?";
    StringBuilder sb = new StringBuilder(s);
    Matcher m = Pattern.compile("[a-zA-Z]+").matcher(s);
    while (m.find()) {
        String word = m.group();
        if (word.length() == 0)
            continue;

        String reversed = new StringBuffer(word).reverse().toString();
        if (word.equalsIgnoreCase(reversed)) {
            StringBuilder replacement = new StringBuilder();
            for (int i = 0; i < word.length(); i++)
                replacement.append('*');
            sb.replace(m.start(), m.end(), replacement.toString());
        }
    }

    System.out.println(sb);
}

问题是什么?问题是字符串的索引超出了范围。我的问题解决了,但如果你能改进我的代码,请这样做。否则没问题。改进?它可以工作,但您需要更好的代码吗?或者它仍然不起作用?您可以在Java 11或更高版本中使用String.repeatint count,或者在旧版本的Java中使用apache commons StringUtils