2016-06-27 48 views
1

以下代碼用於檢查兩個字符串是否具有公共子字符串,如果存在公共子字符串,則輸出YES;如果沒有公共子字符串,則輸出NO。 7號線的確切做法是什麼?請解釋。檢查兩個字符串中是否存在使用位操作的公共子字符串

1  #include<iostream> 
    2  using namespace std; 
    3  
    4  int letterBits(const string &s) { 
    5  int bits = 0; 
    6  for (char ch : s) 
    7   bits |= 1 << (ch - 'a'); 
    8  return bits; 
    10  } 
    11  
    12  int main() { 
    13   int testCases; 
    14   cin >> testCases; 
    15   while (testCases--) { 
    16    string strA, strB; 
    17    cin >> strA >> strB; 
    18    int bitsA = letterBits(strA); 
    19    
    20    int bitsB = letterBits(strB); 
    21    cout<<bitsB<<" "; 
    22    cout << (bitsA & bitsB ? "YES": "NO") << endl; 
    23   } 
    24   return 0; 
    25  } 
+0

有些人會輸入一個字符串來產生負面的或過大的結果給'(ch - 'a')'......這只是一種不好的技術。 –

+0

謝謝你的漂亮的格式和行號。 +1 –

+0

請注意,在第7行的語義中,<< << >>運算符是*左移*,而不是流插入。 –

回答

1

第7行爲其找到的每個字母在整數位中設置一個位。 (例如,如果字母是'a',則設置位0,如果字母'b'則設置位1等)。

此方法僅檢查2個字符串是否具有相同的字母,因此「abc」==「cba」。

+1

實際上,它檢查兩個字符串是否至少有一個字母是相同的,我認爲這是另一種措辭「有一個共同的子字符串」。答案是肯定的,比如說「abc」和「axy」。 –

+0

@IgorTandetnik這樣不管字母的出現順序如何,它只是發現是否有一個共同的字符? – Indhuja

+1

@Indhuja你爲什麼不測試它並自己確認一下? –

相關問題