目錄
387. 字符串中的第一個唯一字符
125. 驗證回文串?
917. 僅僅反轉字母
415. 字符串相加(重點)
541. 反轉字符串 II
387. 字符串中的第一個唯一字符
字符串中的第一個唯一字符 - 力扣(LeetCode)
給定一個字符串?s
?,找到它的第一個不重復的字符,并返回它的索引?。
如果不存在,則返回?-1
?。
示例 1:
輸入: s = "leetcode" 輸出: 0
示例 2:
輸入: s = "loveleetcode" 輸出: 2
示例 3:
輸入: s = "aabb" 輸出: -1
提示:
1 <= s.length <= 105
s
?只包含小寫字母
class Solution {
public:int firstUniqChar(string s) {int count[26] = {0};// 統計次數for(auto ch:s){count[ch-'a']++;}for(size_t i =0; i< s.size(); ++i){if(count[s[i] - 'a'] == 1){return i;}}return -1;}
};
?
ch - 'a'
計算字符ch
相對于字符'a'
的位置索引。例如,字符'a'
的位置為0
,字符'b'
的位置為1
,依此類推。count[ch - 'a']++
表示將count
數組中相應位置的值加 1,從而記錄字符ch
出現的次數。count[s[i] - 'a'] == 1
檢查字符s[i]
是否在字符串s
中只出現了一次。如果是,則返回該字符的索引i
。
125. 驗證回文串?
驗證回文串? - 力扣(LeetCode)
如果在將所有大寫字符轉換為小寫字符、并移除所有非字母數字字符之后,短語正著讀和反著讀都一樣。則可以認為該短語是一個 回文串 。
字母和數字都屬于字母數字字符。
給你一個字符串 s,如果它是 回文串 ,返回 true ;否則,返回 false 。
示例 1:
輸入: s = "A man, a plan, a canal: Panama" 輸出:true 解釋:"amanaplanacanalpanama" 是回文串。
示例 2:
輸入:s = "race a car" 輸出:false 解釋:"raceacar" 不是回文串。
示例 3:
輸入:s = " " 輸出:true 解釋:在移除非字母數字字符之后,s 是一個空字符串 "" 。 由于空字符串正著反著讀都一樣,所以是回文串。
提示:
1 <= s.length <= 2 * 105
s
?僅由可打印的 ASCII 字符組成
class Solution {
public:// 判斷字符是數字還是字母bool isLetterOrNumber(char ch){return (ch >= '0' && ch <= '9')|| (ch >= 'a' && ch <= 'z')|| (ch >= 'A' && ch <= 'Z');}//判斷字符串是否是回文串bool isPalindrome(string s) {// 先小寫字母轉換成大寫,再進行判斷for (auto& ch : s){if (ch >= 'a' && ch <= 'z')ch -= 32;}int begin = 0, end = s.size() - 1;while (begin < end){while (begin < end && !isLetterOrNumber(s[begin]))++begin;while (begin < end && !isLetterOrNumber(s[end]))--end;if (s[begin] != s[end]){return false;}else{++begin;--end;}}return true;}
};
?
while (begin < end)
循環確保指針交替向中間移動,直到它們相遇或交錯。while (begin < end && !isLetterOrNumber(s[begin])) ++begin;
跳過非字母數字字符,移動begin
指針向右。while (begin < end && !isLetterOrNumber(s[end])) --end;
跳過非字母數字字符,移動end
指針向左。- 如果
s[begin] != s[end]
,即對應字符不相等,返回false
,表示字符串不是回文串。 - 如果對應字符相等,繼續移動指針
begin
向右,end
向左。
917. 僅僅反轉字母
僅僅反轉字母 - 力扣(LeetCode)
給你一個字符串 s ,根據下述規則反轉字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小寫或大寫)位置反轉。
返回反轉后的 s 。
示例 1:
輸入:s = "ab-cd" 輸出:"dc-ba"
示例 2:
輸入:s = "a-bC-dEf-ghIj" 輸出:"j-Ih-gfE-dCba"
示例 3:
輸入:s = "Test1ng-Leet=code-Q!" 輸出:"Qedo1ct-eeLg=ntse-T!"
提示:
- 1 <= s.length <= 100
- s 僅由 ASCII 值在范圍 [33, 122] 的字符組成
- s 不含 '\"' 或 '\\'
class Solution {
public:// 判斷字符是否是字母bool isLetter(char ch){if (ch >= 'a' && ch <= 'z')return true;if (ch >= 'A' && ch <= 'Z')return true;return false;}// 反轉字符串中的字母string reverseOnlyLetters(string S) {if (S.empty())return S;size_t begin = 0, end = S.size() - 1;while (begin < end){while (begin < end && !isLetter(S[begin]))++begin;while (begin < end && !isLetter(S[end]))--end;swap(S[begin], S[end]);++begin;--end;}return S;}
};
reverseOnlyLetters
函數接收一個字符串S
,并返回一個僅反轉字母部分的字符串。- 首先檢查字符串是否為空,如果是,則直接返回原字符串。
- 使用
while (begin < end)
循環確保指針交替向中間移動,直到它們相遇或交錯。 while (begin < end && !isLetter(S[begin])) ++begin;
跳過非字母字符,移動begin
指針向右。while (begin < end && !isLetter(S[end])) --end;
跳過非字母字符,移動end
指針向左。swap(S[begin], S[end]);
交換begin
和end
指針指向的字母。- 繼續移動指針
begin
向右,end
向左。 - 當
begin
和end
指針相遇或交錯時,返回反轉后的字符串S
。
415. 字符串相加(重點)
字符串相加 - 力扣(LeetCode)
給定兩個字符串形式的非負整數?num1 和num2?,計算它們的和并同樣以字符串形式返回。
你不能使用任何內建的用于處理大整數的庫(比如 BigInteger),?也不能直接將輸入的字符串轉換為整數形式。
示例 1:
輸入:num1 = "11", num2 = "123" 輸出:"134"
示例 2:
輸入:num1 = "456", num2 = "77" 輸出:"533"
示例 3:
輸入:num1 = "0", num2 = "0" 輸出:"0"
提示:
1 <= num1.length, num2.length <= 104
num1
?和num2
?都只包含數字?0-9
num1
?和num2
?都不包含任何前導零
class Solution {
public:string addStrings(string num1, string num2) {int end1 = num1.size() - 1;int end2 = num2.size() - 1;string str;int next = 0;// 進位while(end1 >= 0 || end2 >= 0){int x1 = end1 >= 0 ? num1[end1--] - '0' : 0;int x2 = end2 >= 0 ? num2[end2--] - '0' : 0;int x = x1 + x2 + next;// 處理進位next = x / 10;x = x % 10;// 頭插// str.insert(0, 1, '0'+x);str.insert(str.begin(), '0'+x);}// 還有一個進位沒處理if(next == 1){str.insert(str.begin(), '1');} return str;}
};
?
while (end1 >= 0 || end2 >= 0)
循環確保我們遍歷兩個字符串,直到兩個字符串都處理完畢。x1
和x2
分別是當前字符對應的數字,如果對應的字符已經處理完畢,則賦值為0
。x
是當前位相加的結果,包括進位next
。next = x / 10
計算新的進位值。x = x % 10
計算當前位的實際數字。str.insert(str.begin(), '0' + x)
將當前位的結果插入到結果字符串的頭部。end1--
和end2--
將指針分別向前移動一位。- 如果循環結束后還有進位,則在結果字符串的頭部插入
'1'
。
class Solution {
public:string addStrings(string num1, string num2) {int end1 = num1.size() - 1;int end2 = num2.size() - 1;string str;int next = 0;// 進位while(end1 >= 0 || end2 >= 0){int x1 = end1 >= 0 ? num1[end1--] - '0' : 0;int x2 = end2 >= 0 ? num2[end2--] - '0' : 0;int x = x1 + x2 + next;// 處理進位next = x / 10;x = x % 10;// 尾插str += ('0' + x);}// 還有一個進位沒處理if(next == 1){str += '1';} reverse(str.begin(), str.end());return str;}
541. 反轉字符串 II
541. 反轉字符串 II
給定一個字符串 s 和一個整數 k,從字符串開頭算起,每計數至 2k 個字符,就反轉這 2k 字符中的前 k 個字符。
如果剩余字符少于 k 個,則將剩余字符全部反轉。
如果剩余字符小于 2k 但大于或等于 k 個,則反轉前 k 個字符,其余字符保持原樣。
示例 1:
輸入:s = "abcdefg", k = 2 輸出:"bacdfeg"
示例 2:
輸入:s = "abcd", k = 2 輸出:"bacd"
提示:
1 <= s.length <= 10000
s 僅由小寫英文組成
1 <= k <= 10000
class Solution {
public:string reverseStr(string s, int k) {int n = s.length();for(int i = 0; i < n; i += 2 * k)reverse(s.begin() + i, s.begin() + min(i + k, n));return s;}
};
今天就先到這了!!!
看到這里了還不給博主扣個:
?? 點贊??收藏 ?? 關注!
你們的點贊就是博主更新最大的動力!
有問題可以評論或者私信呢秒回哦。