0

我正在尝试编写一个代码,询问用户一个字符串并打印出这个字符串是否是回文。

执行代码时,它直接进入打印语句,for 循环不会进入字符串并比较值。

  print("Enter a word to check for palindrome: ");
  String word = stdin.readLineSync()!;
  List<String> palindrome = [word];
  var flag = 0;

  //var len = palindrome.length;

 for (int i = 0; i < palindrome.length; i++) {
    if (palindrome[i] != palindrome[palindrome.length - i - 1]) {
      flag = 1;
      break;
    }
  }

  if (flag == 0) 
  {
    print("$palindrome is palindrome.");
  } else 
  {
    print("$palindrome is not palindrome.");
  }
4

2 回答 2

0

你的问题是你写:

List<String> palindrome = [word];

然后检查是否palindrome是回文作为元素列表。因为它只有一个元素,所以它是一个与自身相等的词。你永远不会检查是否word是回文。

您可能希望检查字符串的各个字符是否形成回文。如果将该行更改为:

String palindrome = word;

那么你的代码会做到这一点。

然而,除了早期的编码练习之外,这种方法太天真了,无法在并非所有字母都是 ASCII 且并非所有字符都由单个代码单元表示的现实世界中工作。

仅使用代码单元的问题是像""aka 这样的字符串。“\u{1f602}”,应该是回文(它只包含一个“字符”),但实际的字符串表示是"\uD83d\uDE02",它不是代码单元级别的回文(并且交换代码单元不是有效的 UTF -16)。因此,要认识到这一点,您必须将这两个代码单元视为一个字符。

至少,我会使用runesgetterString来访问代码以及是否检查这些代码点是否形成回文。如果字符串包含简单的非基本多语言平面字符,那么结果仍然是正确的,在 Dart 中由两个代码单元表示:

var r1 = word.runes.iterator;
var r2 = word.runes.iterator..reset(word.length);
while (r1.moveNext() && r2.movePrevious()) {
  if (r1.rawIndex >= r2.rawIndex) break; // Reached the middle.
  if (r1.current != r2.current) {
    flag = 1;
    break;
  }
}

最好,对于现实世界的文本,我建议使用该characters来访问文本的字素簇,它可以由多个代码点组成。

同样的问题也适用:字符串"️‍&quot;看起来像一个字符,因此是回文,但实际上它是一个"️\u200D"(白旗、零宽度连接符、彩虹)序列,就像许多其他表情符号是由多个部分创建的一样。字符包会将彩虹旗识别为一个“字符”。

import "package:characters/characters.dart";
...
  var r1 = words.characters.iterator;
  var r2 = words.characters.iteratorAtEnd;
  while (r1.moveNext() && r2.moveBack()) {
    if (r1.stringBeforeLength >= r2.stringBeforeLength) {
      break; // Reached the middle.
    }
    if (r1.current != r2.current) {
      flag = 1;
      break;
    }
  }

您仍然会遇到 Unicode 规范化问题。该字符串"éé"看起来像回文,但实际上是"ée\u0301",它包含相同重音字符的两种不同e表示形式,一种是单个字符,另一种是e后面带有组合重音的 an。characters 包会将它们报告为不同的代码点序列,并且不知道它们代表相同的字符

于 2021-08-25T14:07:12.770 回答
0

你可以检查

word == word.split('').reversed.join('')

于 2021-08-25T00:53:49.413 回答