生成回文词

问题描述 投票:-1回答:2

所以,我有这个代码以特殊方式生成回文词。 1>它通过反向连接单词(不包括最后一个字符)。 2>以重复字母结尾的单词,例如ABB变为ABBA而不是ABBBA,XAZZZ变为XAZZZAX。我已经完成了第一部分。我刚刚通过提取最后两个字符尝试了第二个,因为老实说,我不知道该怎么做。

import java.io.*;
class ISC_Q3_2019
{
    public static void main(String args[])throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        ISC_Q3_2019 ob = new ISC_Q3_2019();
        System.out.println("Enter your sentence");
        String s = br.readLine();
        s=s.toUpperCase();
        String words[] = s.split(" ");
        int l=words.length;
        char ch1=s.charAt(s.length()-1);
        String ans=" ", copy=" ", p=" ";
        if(ch1=='.'||ch1=='!'||ch1=='?')
        {
            for(int i=0;i<l;i++)
            {
                if(ob.isPalindrome(words[i])==true)
                {
                    ans=ans+words[i];
                }
                else
                {
                    copy=words[i];
                    words[i]=ob.Reverse(words[i]);
                    p=copy.concat(words[i]);
                    ans=ans+p;
                }
            }
            System.out.println("OUTPUT:" +ans.trim());
        }
        else
            System.out.println("Invalid Input!");
    }
    boolean isPalindrome(String s)
    {
        s=s.toUpperCase();
        int l=s.length();
        char ch;
        String rev=" ", copy=" ";
        copy=s;
        for(int i=l-1;i>=0;i--)
        {
            ch=s.charAt(i);
            rev=rev+ch;
        }
        if(rev.equals(copy))
            return true;
        else
            return false;
    }
    String Reverse(String s)
    {
        s=s.toUpperCase();
        int l=s.length();
        char ch, ch1, ch2;
        String r=" ";
        for(int i=l-2;i>=0;i--)
        {
            ch=s.charAt(i);
            ch1=s.charAt(l-1);
            ch2=s.charAt(l-2);
            if(ch1==ch2)
                r=r+ch;
            else
                r=r+ch;
            }
        return r;
    }
}

OUTPUT:

输入你的句子abb正在飞行。

**输出:** HTABB BAIS IFLYING。 GNIYLF

另一部分我关心的是无与伦比的空间。

java string palindrome
2个回答
0
投票

干得好

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Palindrome {
    public static void main(String... args) {
        // Request for input
        Scanner reader = new Scanner(System.in);
        System.out.println("Enter your sentence...");

        // Read the user input
        String sentence = reader.nextLine();

        // Split the sentence (into tokens) at spaces and special characters using regex
        // Keep the special characters where they are and form a List with the split words
        List<String> tokens = Arrays.asList(sentence.split("((?<=[\\?,\\. ])|(?=[\\?,\\. ]))"));

        // For every token/word, form the palindrome of that and then join them back
        String result = tokens.stream().map(s -> formPalindrome(s)).collect(Collectors.joining());

        // This is the final result
        System.out.println("result: " + result);

        reader.close();
    }

    private static String formPalindrome(String str) {
        // Reverse the String
        String reversed = new StringBuilder(str).reverse().toString();

        // String length
        int strLen = reversed.length();

        // Compare each character of reversed string with last character of the string until they are different
        // When they are different concat the substring with original string
        for (int i = 0; i < strLen; i++) {
            if (reversed.charAt(i) != str.charAt(strLen - 1)) {
                return str + reversed.substring(i);
            }
        }

        return str;
    }
}

0
投票

这是一个可以构建的想法*,以获得所需的结果:

  1. 反过来检查原始的Strings字符并计算出现的次数
  2. 从原始的String开始创建一个新的String,直到最后减少出现的次数
  3. 扭转新的String
  4. 将原始的String与新的String连接起来

所以一个快速抛出的例子:

int count = 0;
for (int i = s.length() - 1; i > 0; i--) {
    if (s.charAt(i) == s.charAt(i - 1)) {
        count++;
    } else {
        break;
    }
}
StringBuilder sb = new StringBuilder(s.substring(0, s.length() - 1 - count)).reverse();
System.out.println(s + sb.toString());

其中“ABBA”代表“ABB”,“XAZZAX”代表“XAZZZ”。

*这只是一个想法,可能有边缘情况等没有照顾,但它只是给OP一个如何处理它的想法

© www.soinside.com 2019 - 2024. All rights reserved.