字符串相关的结构和算法
字符串本质上是字符的数组,很多算法题与此相关。
a. 判断一个字符串是否是回文,忽略非ASCII值,忽略大小写。比如"A man, a plan, a canal: Panama"就是一个合法的回文字符串。
View Code
class Solution{ bool isPalindrome(string s) { if (s.empty()) return true; int start = 0; int end = s.size() - 1; while (start < end){ if (!isLetter(s[start]) && !isNumber(s[start])) { start++; continue; } if(!isLetter(s[end]) && !isNumber(s[end])) { end--; continue; } if (s[start] != s[end]) { if (isNumber(s[start]) || isNumber(s[end])) return false; int diff = s[start] - s[end]; if (diff != 32 && diff != -32) return false; } start++; end--; } return true; } }
回顾:判断是否回文子串,解法很简单,最重要的是搞清楚题目要求,哪些类型的char是被考虑的,哪些是被忽略的,然后两头指针向中间靠拢即可。
b. 一个int数组里面只有0,1,2三种数,求一次遍历的排序方法。(本质上是使用cursor,和大部分字符串处理的题类似,因此归位一类。)
View Code
class Solution { void sort(int[] A, int n) { if (n < 1) return; int i = 0, j = n-1, k = n-1; while (i <= j) { if (A[i] == 2) { swap(A[i], A[k]); k--; j = k < j ? k : j; } else if (A[i] == 1) { swap(A[i], A[j]); j--; } else ++i } } void swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } };
回顾,这道题的经典之处在于需要保持两个后指针,一个前指针,想清楚的指针移动的规则就可以解决。

浙公网安备 33010602011771号