簡體   English   中英

混淆了回文檢驗的工作原理

[英]confused how this palindrome test works

這段代碼可用於測試簡單的回文,但是我對它的工作方式感到困惑。 我對while循環條件感到困惑,檢查if (left < right)以及它如何自動表示它不是回文。

left = 0;
right = i.length() -1;

while(i.charAt(left) == i.charAt(right) && right > left){
    left++;
    right--;
}

System.out.println();
if (left < right)
    System.out.println ("That string is Not a palindrome.");
else
    System.out.println("That string IS a palindrome");

while循環基本上同時從相反的兩側開始遍歷潛在回文,並比較每側的字符。 它正在檢查(右>左)是否存在,這意味着“右”和“左”計數器沒有相互傳遞,因此沒有到達(或通過)字符串的中間。 檢查之后,它會向右遞減(因此它會稍微靠近字符串的中心),並向“左”遞加(出於相同的原因)。

最后,如果'left'仍然小於'right',則意味着循環在'left'或'right'到達字符串的中間之前停止,並且這是因為相反索引的字符在某個階段會匹配是錯誤的。

如果他們確實到達(或通過)中間,則“ left”將大於等於“ right”,這意味着字符匹配條件至少在字符串的中間為真,因此是回文。

僅當您的字符串全部為大寫或小寫時,回文測驗才有效。

當左字符不等於右字符或右索引>左索引(您已傳遞字符串的“中間”)時,while循環將結束。

如果(left <right)與right> left相同,並且該字符串是回文(一種情況),否則左字符不等於右字符。

希望對您有所幫助。

while語句中的條件檢查X == YX < Y 如果這些條件不再有效,它將退出while循環。

考慮下面的回文。

迭代1:

    X                                 Y
    +                                 +
    |                                 |
  +-v--+----+---+---+---+---+---+---+-v-+
  |    |    |   |   |   |   |   |   |   |
  | A  | B  | C | D | E | D | C | B | A |
  +----+----+---+---+---+---+---+---+---+

迭代2:

  +----+----+---+---+---+---+---+---+---+
  |    |    |   |   |   |   |   |   |   |
  | A  | B  | C | D | E | D | C | B | A |
  |    |    |   |   |   |   |   |   |   |
  +----+----+---+---+---+---+---+---+---+
         ^                        ^
         |                        |
         +                        +

         X                        Y

迭代3:

              X               Y
              +               +
              |               |
              v               v
  +----+----+---+---+---+---+---+---+---+
  |    |    |   |   |   |   |   |   |   |
  | A  | B  | C | D | E | D | C | B | A |
  |    |    |   |   |   |   |   |   |   |
  +----+----+---+---+---+---+---+---+---+

迭代4:

                  X       Y
                  +       +
                  |       |
  +- --+----+---+-v-+---+-v-+---+---+- -+
  |    |    |   |   |   |   |   |   |   |
  | A  | B  | C | D | E | D | C | B | A |
  +----+----+---+---+---+---+---+---+---+

迭代5:循環將在此時中斷。 由於X < Y不再有效

                     XY
                     ++
                     ||
  +----+----+---+---+vv-+---+---+---+---+
  |    |    |   |   |   |   |   |   |   |
  | A  | B  | C | D | E | D | C | B | A |
  |    |    |   |   |   |   |   |   |   |
  +----+----+---+---+---+---+---+---+---+

如果上面的例子不是回文,看起來像這樣

  +- --+----+---+-v-+---+-v-+---+---+- -+
  |    |    |   |   |   |   |   |   |   |
  | A  | B  | K | D | E | D | C | B | A |
  +----+----+---+---+---+---+---+---+---+

然后,由於第一個條件X==Y您的while循環在第3個迭代處中斷。 此時X仍將小於Y 因此,如果字符串不是回文,而while循環肯定會在XY遇到之前中斷,即始終X < Y

它有助於使用打印語句來觀察程序在運行時的工作。

class Ideone
{
    private static void checkPalindrome(String i) {
        int left = 0;
        int right = i.length() -1;
        System.out.println("This word is: " + i);
        System.out.println("Checking charAt(" + left + ") which is " +
            i.charAt(left) + " and chartAt(" + right + ") which is " +
            i.charAt(right));
        while(i.charAt(left) == i.charAt(right) && right > left) {
            left++; right--;
            System.out.println("Checking charAt(" + left + ") which is " +
                i.charAt(left) + " and chartAt(" + right + ") which is " +
                i.charAt(right));
        }

        System.out.println();
        if (left < right)
            System.out.println ("That string is Not a palindrome.");
        else
            System.out.println("That string IS a palindrome");
        System.out.println();
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        checkPalindrome("racecar");
        checkPalindrome("abba");
        checkPalindrome("java");
    }
}

產量

This word is: racecar
Checking charAt(0) which is r and chartAt(6) which is r
Checking charAt(1) which is a and chartAt(5) which is a
Checking charAt(2) which is c and chartAt(4) which is c
Checking charAt(3) which is e and chartAt(3) which is e

That string IS a palindrome

This word is: abba
Checking charAt(0) which is a and chartAt(3) which is a
Checking charAt(1) which is b and chartAt(2) which is b
Checking charAt(2) which is b and chartAt(1) which is b

That string IS a palindrome

This word is: java
Checking charAt(0) which is j and chartAt(3) which is a

That string is Not a palindrome.

如您所見,while循環從字符串的遠端開始,並比較每一側的字符; 如果它們相同,則在每一側移動一個字符。 它檢查“ right > left以便知道何時停止。 一旦到達中間位置,由於它們在中間相遇並朝相反的方向運動,因此right至少等於或大於left

left < right的布爾取反等於left >= right 如果兩個人在中間相遇,這將是正確的。 如果left < right那么他們將無法在中間相遇。 您應該能夠在上面的輸出中看到這一點。

在ideone上運行此代碼,然后再使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM