只能说之前动态规划做多了,看到就想到动态规划,然后想想其实完全不需要,回溯法就行了。
一开始用了很多莫名其妙的代码,写的很复杂……(主要因为最后不能加‘.’)其实想想只要最后加入vector时去掉最后一个字符就好了。
class Solution {
bool three(char a,char b,char c){
if(a=='0') return 0;
if((a-'0')*100+(b-'0')*10+(c-'0')>255) return 0;
return 1;
}
public:
vector<string> result;
void hs(string s,string r,int point){
if(s.size()==0&&point==4) result.push_back(r.substr(0,r.size()-1));
if(s.size()>(4-point)*3) return;
if(s.size()<4-point) return;
if(s.size()>=3&&three(s[0],s[1],s[2])==1){
hs(s.substr(3),r+s.substr(0,3)+'.',point+1);
}
if(s.size()>=2&&s[0]!='0'){
hs(s.substr(2),r+s.substr(0,2)+'.',point+1);
}
if(s.size()>=1){
hs(s.substr(1),r+s[0]+'.',point+1);
}
}
vector<string> restoreIpAddresses(string s) {
string r;
hs(s,r,0);
return result;
}
};
感想是剪枝真的很奇妙,看到题目提示1 <= s.length <= 20
就觉得很不对劲,根据s的长度剪一下枝发现快了很多。