PAT-BASIC1029——舊鍵盤
阿新 • • 發佈:2018-12-16
題目描述:
知識點:雙指標
思路:用雙指標分別遍歷兩個字串,比較字元是否相同
index1和index2雙指標都從0位置開始遍歷。
(1)如果index1和index2均超出了字串的長度範圍,則break跳出迴圈。
(2)如果index1未超出字串input1的長度範圍,index2超出了字串input2的長度範圍,那麼將input1字串中index1級之後的字元對應鍵盤上的鍵均是破損的。
(3)如果index1對應的字元與index2對應的字元相等,說明該字元對應的鍵未破損,index1和index2均遍歷下一個字元。
(3)如果index1對應的字元與index2對應的字元不相等,說明index1對應的字元所對應的鍵破損,僅令index1遍歷下一個字元,index2保持原位置不變。
注意點:
(1)小寫字元要轉化成大寫字元
(2)將新字元加入破損的vector之前,需要用vector<char>::iterator型別的迭代器it來判斷新字元是否在破損的vector中。可以用語句it = find(broken.begin(), broken.end(), c)。如果在broken中未找到字元c,則it == broken.end()。否則,說明在broken中找到了字元c。
時間複雜度是O(n),其中n輸入的第一個字串的長度。空間複雜度是O(m),其中m為破損的鍵數。
C++程式碼:
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; int main() { string input1; string input2; cin >> input1 >> input2; vector<char> broken; int index1 = 0; int index2 = 0; while (true) { if (index1 >= input1.length() && index2 >= input2.length()) { break; } else if (index1 < input1.length() && index2 >= input2.length()) { for (int i = index1; i < input1.length(); i++) { char c = input1[i]; if (c >= 'a' && c <= 'z') { c = c - 'a' + 'A'; } vector<char>::iterator it; it = find(broken.begin(), broken.end(), c); if (it == broken.end()) { broken.push_back(c); } } break; }else if (input1[index1] == input2[index2]) { index1++; index2++; } else if (input1[index1] != input2[index2]) { char c = input1[index1]; if (c >= 'a' && c <= 'z') { c = c - 'a' + 'A'; } vector<char>::iterator it; it = find(broken.begin(), broken.end(), c); if (it == broken.end()) { broken.push_back(c); } index1++; } } for (int i = 0; i < broken.size(); i++) { cout << broken[i]; } }
C++解題報告: