力扣(131.93)补9.21
131.分割回文串
又是不会做的一题呢。
代码看起来不难,但想出代码还是很难得。
class Solution {
public List<List<String>> partition(String s) {
List<List<String>> ans=new ArrayList<>();
List<String> list=new ArrayList<>();
back(ans,list,s,0);
return ans;
}
boolean huiwen(String s ,int index,int i){
for(int j=index,k=i;j<k;j++,k--){
if(s.charAt(j)!=s.charAt(k))
return false;
}
return true;
}
void back(List<List<String>> ans,List<String> list,String s,int index){
if(index>=s.length()){
ans.add(new ArrayList<>(list));
return ;
}
for(int i=index;i<s.length();i++){
if(huiwen(s,index,i)==true){
list.add(s.substring(index,i+1));
}
else{
continue;
}
back(ans,list,s,i+1);
list.remove(list.size()-1);
}
}
}
93.复原IP地址
不会,距离上次做题又过了3个星期,本来是想每日2题,结果搞笑的是,大概每隔2个星期碰一次力扣,最终做成了每日一题的样子,由于某些因素,最近又要考虑用C++刷题。
class Solution {
private:
vector<string> res;
bool isvalid(const string&s,int start,int end){
if(start>end)
return false;
if(s[start]=='0'&&start!=end)
return false;
这俩个if语句是为了解决部分特殊用例。很细节的。
int num=0;
for(int i=start;i<=end;i++){
if(s[i]>'9'||s[i]<'0')
return false;
num=num*10+s[i]-'0';
if(num>255)
return false;
}
return true;
}
void back(string&s,int start,int pointnum){
if(pointnum==3){
if(isvalid(s,start,s.size()-1))
res.push_back(s);
return;
}
for(int i=start;i<s.size();i++){
if(isvalid(s,start,i)){
pointnum++;
s.insert(s.begin()+i+1,'.');
back(s,i+2,pointnum);
s.erase(s.begin()+i+1);
pointnum--;
}else break;
}
}
public:
vector<string> restoreIpAddresses(string s) {
res.clear();
if(s.size()<4||s.size()>12) return res;
back(s,0,0);
return res;
}
};