算法周训5,本来这应该就发了的,一直拖到了现在,总结一部分还是有所欠缺,希望接下来继续吧。
主要题目以回文、暴力法,dp解决。
重新格式化电话号码
分析一下题目,主体思想就是分组,只需要遍历string就可以。不过这个题目我就是单纯地模拟运算,主要要讨论最后的数字与3的关系,具体见下:
class Solution {
public:
string reformatNumber(string number) {
string s="";
for(int i=0;i<number.size();i++) {
if(number[i] != ' ' && number[i] != '-') {
s += number[i];
}
}
int n = s.size();
int m = n%3;
string t = "";
if(m == 0 || m ==2) {
for(int i=0;i<s.size();i++) {
t += s[i];
if( i%3 == 2 && i != s.size()-1 ) {
t += '-';
}
}
}
if( m == 1) {
for(int i=0;i<s.size()-4;i++) {
t += s[i];
if( i%3 == 2 && i != s.size()-1 ) {
t += '-';
}
}
t += s[s.size()-4] ;
t += + s[s.size()-3] ;
t += '-';
t += s[s.size()-2] ;
t += s[s.size()-1] ;
}
return t;
}
};
在LR交换相邻字符
这个题目主要的思想就是将X删除,然后比较R与L。
class Solution {
public:
bool canTransform(string start, string end) {
int n = start.size(),sx =0 ,ex = 0;
for(int i=0,j=0;i<n || j<n ;i++,j++) {
while(start[i] == 'X') {
sx++;
i++;
}
while(end[j] == 'X') {
ex++;
j++;
}
if(start[i] != end[j]) return false;
if(start[i] == 'L' && sx < ex) return false;
if(start[i] == 'R' && sx > ex) return false;
}
return true;
}
};
相同的树
常规思路题目,一直递归遍历就可以
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if(!p && !q){
return true;
}
else if(!q ^ !p){
return false;
}
else if(q->val!= p->val){
return false;
}
else{
return (isSameTree(p->left , q->left )&& isSameTree(p->right , q->right) );
}
}
};
最长回文子串
暴力法解决
class Solution {
public:
string longestPalindrome(string s) {
string res;
for (int i = 0; i < s.size(); i ++) {
int l = i - 1, r = i + 1;
while (l >= 0 && r < s.size() && s[l] == s[r]) l --, r ++;
if (res.size() < r - l - 1) res = s.substr(l + 1, r - l - 1);
l = i - 1; r = i;
while (l >= 0 && r < s.size() && s[l] == s[r]) l --, r ++;
if (res.size() < r - l - 1) res = s.substr(l + 1, r - l - 1);
}
return res;
}
};
无重复字符的最长子串
双指针问题
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> hash;
int res = 0;
for (int i = 0, j = 0; i < s.size(); i++) {
hash[s[i]]++;
while (hash[s[i]] > 1) hash[s[j++]]--;
res = max(res, i - j + 1);
}
return res;
}
};