如何检查Java输入的Sentence本质上是否是回文(不完全是,但像那样)?
How to check in Java whether the input Sentence is of palindrome(not exactly, but like that) in nature or not?
我有一个字符串输入
"I LOVE MY COUNTRY INDIA COUNTRY MY LOVE I".
这是一个完美的回文句,因为单词序列从头到尾完全匹配。
我想创建一个函数来使用 Java 证明这一点。我只想检查像 "I love phone love I" 这样的单词的位置和顺序,这意味着 从两端阅读时应该相同的自然句子 。我试过以下代码:
void checkPalindrome()
{
String str = "I LOVE MY COUNTRY INDIA COUNTRY MY LOVE I";
List<String> list=new ArrayList<String>();
int i,flag=0,cnt=0;
for(i=0;i<str.length();i++)
{
if(str.charAt(i)==' ')
{
list.add(str.substring(flag, i).toString());
flag=i;
}
}list.add(str.substring(flag, i).toString());
Iterator<String> it1=list.iterator();
ListIterator<String> it2=list.listIterator(list.size());
while(it1.hasNext() && it2.hasPrevious())
{
if(it1.next().equals(it2.previous()))
{
cnt++;
}
}
if(cnt==list.size())
System.out.println("Palindrome nature found");
}
顺便说一句,这不起作用,请帮助我以正确的方式做到这一点。
根据您的问题,字符串的第一个元素应与最后一个匹配,第二个与最后第二个匹配,依此类推。
因此,根据“”拆分字符串将为您提供一个字符串数组。下一步是检查 Ist 和 last string 是否相等等等。因此,ps[i].equals(ps[ps.length-1 - i])。
如果在任何时候,字符串不匹配,则中断循环并推断该字符串不是回文。
检查这个实现:-
void checkPalindrome() {
String str = "I LOVE MY COUNTRY INDIA COUNTRY MY LOVE I";
String[] ps = str.split(" ");
boolean palindrome = true;
int center = (int) ps.length / 2;
for (int i = 0; i < center; i++) {
if (ps[i].equals(ps[ps.length-1 - i])) {
palindrome = true;
} else {
palindrome = false;
break;
}
}
System.out.println(palindrome);
}
如果您在开始编码之前分析问题,您将看到:
字符串定义如下:
[I, LOVE, MY, COUNTRY, INDIA, COUNTRY, MY, LOVE, I]
[0, 1, 2 , 3, 4, 5, 6, 7, 8]
所以它必须与索引处的单词匹配:
0 == 8
1 == 7
2 == 6
....
....
或序列
i == x.size- i - 1
您的代码可以简化为:
private static boolean getPa(String str) {
String[] list = str.split(" ");
boolean xc = false;
for (int i = 0; i < list.length / 2; i++) {
xc = list[i].equalsIgnoreCase(list[list.length - i - 1]);
if (!xc) {
return false;
}
}
return true;
}
或使用集合
private static boolean getPa(String str) {
List<String> list = Arrays.asList(str.split(" "));
boolean xc = false;
for (int i = 0; i < list.size() / 2; i++) {
xc = list.get(i).equalsIgnoreCase(list.get(list.size() - i - 1));
if (!xc) {
return false;
}
}
return true;
}
先把str的单词取一个数组。然后检查顺序和逆序中的单词是否相同
String[] words = str.split(" "); //splits at spaces
boolean flag = true;
int i, last = words.length - 1;
for(i = 0; i <= last/2; i++){
if(!words[i].equalsIgnoreCase(words[last - i])){
flag = false;
System.out.printf("NOT PALINDROME");
break;
}
}
if(flag)
System.out.printf("PALINDROME");
在您的代码中,将标志增量更改为 i+1,因为您希望在 space
之后移动标志
if(str.charAt(i)==' ')
{
list.add(str.substring(flag, i).toString());
flag=i+1;
}
但是您的代码进行了不必要的检查,因为您只需要检查字符串的一半。如果没有匹配,你也应该在这里打破循环:
while(it1.hasNext() && it2.hasPrevious())
{
if(it1.next().equals(it2.previous()))
{
cnt++;
}
}
这是我的解决方案:
public boolean checkPalindrome(String str) {
String[] words = str.split(" ");
for (int i = 0; i < words.length / 2; i++) {
if(!words[i].equals(words[words.length - i - 1]){
return false;
}
}
return true;
}
我有一个字符串输入
"I LOVE MY COUNTRY INDIA COUNTRY MY LOVE I".
这是一个完美的回文句,因为单词序列从头到尾完全匹配。
我想创建一个函数来使用 Java 证明这一点。我只想检查像 "I love phone love I" 这样的单词的位置和顺序,这意味着 从两端阅读时应该相同的自然句子 。我试过以下代码:
void checkPalindrome()
{
String str = "I LOVE MY COUNTRY INDIA COUNTRY MY LOVE I";
List<String> list=new ArrayList<String>();
int i,flag=0,cnt=0;
for(i=0;i<str.length();i++)
{
if(str.charAt(i)==' ')
{
list.add(str.substring(flag, i).toString());
flag=i;
}
}list.add(str.substring(flag, i).toString());
Iterator<String> it1=list.iterator();
ListIterator<String> it2=list.listIterator(list.size());
while(it1.hasNext() && it2.hasPrevious())
{
if(it1.next().equals(it2.previous()))
{
cnt++;
}
}
if(cnt==list.size())
System.out.println("Palindrome nature found");
}
顺便说一句,这不起作用,请帮助我以正确的方式做到这一点。
根据您的问题,字符串的第一个元素应与最后一个匹配,第二个与最后第二个匹配,依此类推。 因此,根据“”拆分字符串将为您提供一个字符串数组。下一步是检查 Ist 和 last string 是否相等等等。因此,ps[i].equals(ps[ps.length-1 - i])。 如果在任何时候,字符串不匹配,则中断循环并推断该字符串不是回文。 检查这个实现:-
void checkPalindrome() {
String str = "I LOVE MY COUNTRY INDIA COUNTRY MY LOVE I";
String[] ps = str.split(" ");
boolean palindrome = true;
int center = (int) ps.length / 2;
for (int i = 0; i < center; i++) {
if (ps[i].equals(ps[ps.length-1 - i])) {
palindrome = true;
} else {
palindrome = false;
break;
}
}
System.out.println(palindrome);
}
如果您在开始编码之前分析问题,您将看到:
字符串定义如下:
[I, LOVE, MY, COUNTRY, INDIA, COUNTRY, MY, LOVE, I]
[0, 1, 2 , 3, 4, 5, 6, 7, 8]
所以它必须与索引处的单词匹配:
0 == 8
1 == 7
2 == 6
....
....
或序列
i == x.size- i - 1
您的代码可以简化为:
private static boolean getPa(String str) {
String[] list = str.split(" ");
boolean xc = false;
for (int i = 0; i < list.length / 2; i++) {
xc = list[i].equalsIgnoreCase(list[list.length - i - 1]);
if (!xc) {
return false;
}
}
return true;
}
或使用集合
private static boolean getPa(String str) {
List<String> list = Arrays.asList(str.split(" "));
boolean xc = false;
for (int i = 0; i < list.size() / 2; i++) {
xc = list.get(i).equalsIgnoreCase(list.get(list.size() - i - 1));
if (!xc) {
return false;
}
}
return true;
}
先把str的单词取一个数组。然后检查顺序和逆序中的单词是否相同
String[] words = str.split(" "); //splits at spaces
boolean flag = true;
int i, last = words.length - 1;
for(i = 0; i <= last/2; i++){
if(!words[i].equalsIgnoreCase(words[last - i])){
flag = false;
System.out.printf("NOT PALINDROME");
break;
}
}
if(flag)
System.out.printf("PALINDROME");
在您的代码中,将标志增量更改为 i+1,因为您希望在 space
之后移动标志if(str.charAt(i)==' ')
{
list.add(str.substring(flag, i).toString());
flag=i+1;
}
但是您的代码进行了不必要的检查,因为您只需要检查字符串的一半。如果没有匹配,你也应该在这里打破循环:
while(it1.hasNext() && it2.hasPrevious())
{
if(it1.next().equals(it2.previous()))
{
cnt++;
}
}
这是我的解决方案:
public boolean checkPalindrome(String str) {
String[] words = str.split(" ");
for (int i = 0; i < words.length / 2; i++) {
if(!words[i].equals(words[words.length - i - 1]){
return false;
}
}
return true;
}