此代碼不適用于測驗用例: aacabdkacaa,但適用于babador cbbd。我寫了一個列印陳述句來除錯并意識到代碼認為字串aacakdbacaa和aacabdkacaa由于某種原因是等價的。他們顯然不是,所以我錯過了什么?
class Solution {
public String longestPalindrome(String s) {
String longPal = "";
for(int i = 0; i < s.length(); i ) {
for(int j = s.length()-1; j >= i; j--) {
if(s.charAt(i) == s.charAt(j)) {
StringBuilder sb = new StringBuilder(s.substring(i, j 1));
if(sb.reverse().toString().equals(sb.toString())
&& sb.toString().length() > longPal.length()) {
longPal = sb.toString();
System.out.println(sb.toString() " equals " sb.reverse().toString());
}
sb.setLength(0);
}
}
}
return longPal;
}
}
uj5u.com熱心網友回復:
代碼不這么認為aacakdbacaa并且aacabdkacaa是平等的。
if陳述句中條件的第一部分是 this
sb.reverse().toString().equals(sb.toString())
所以代碼(JVM)認為這個條件是true. 這是為什么?這背后隱藏著什么知識(因為有一些)?
隱藏的知識部分(它并不是真正隱藏的,它在檔案中)是 StringBuilderreverse方法改變了StringBuilder的狀態(幾乎所有 SB 方法都這樣做)。該reverse方法還回傳 StringBuilder 實體本身(其他一些 SB 方法也是如此)。
所以呼叫sb.reverse()只是反轉 StringBuilder 實體的內容并回傳實體本身(同一個實體!)。實體沒有改變,只是它的內部狀態發生了變化。
然后我們呼叫toString()它,它回傳String當前狀態的表示(如預期的那樣)。
然后我們呼叫equals回傳的值并作為第一個引數的值String傳入equals sb.toString()。但是sb與sb.reverse()之前回傳的實體相同。它的狀態在兩者之間沒有改變,所以我們得到了String從呼叫回傳的相同表示sb.toString()。
因此
sb.reverse().toString().equals(sb.toString())
是真的。
我們可以稍微不同地寫它,但仍然得到相同的結果
String s1 = sb.reverse().toString() // sb state changed here when .reverse() was called
String s2 = sb.toString()
s1.equals(s2) // true
或者像這樣,這很明顯
sb.reverse() // sb state changed here
String s1 = sb.toString()
String s2 = sb.toString()
s1.equals(s2) // true
但是,如果我們使用這個順序,我們會得到不同的結果
String s1 = sb.toString()
sb.reverse() // sb state changed here
String s2 = sb.toString()
s1.equals(s2) // now it depends, true if palindrome, false otherwise!
這與
String s1 = sb.toString()
String s2 = sb.reverse().toString()
s1.equals(s2) // true if palindrome, false otherwise!
所以這將是檢查回文的正確檢查
sb.toString().equals(sb.reverse().toString())
獎勵:從方法呼叫回傳相同實體的做法稱為Fluent interface。
uj5u.com熱心網友回復:
StringBuilder 的 reverse() 方法導致它的字符序列被序列的反向替換,因此 sb.reverse().toString().equals(sb.toString()) 總是結果為真。宣告另一個字串String p = sb.toString()然后用它來比較sb.reverse().toString().equals(p.toString())可能會解決問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/406431.html
標籤:
