剑指 Offer II 回溯法

086. 分割回文子字符串

用substr枚举 因为是连续的 不是放与不放的问题

class Solution {
public:
vector<vector<string>>ans;
vector<string>path;
bool check()
{
    for(string x:path)
    {
        for(int i=0;i<x.size();i++)
        {
            if(x[i]!=x[x.size()-1-i])return false;
        }

    }
    return true;
}
void dfs(int x,string s)
{
    if(x==s.size())
    {
        if(check())ans.push_back(path);
        return ;
    }
    for(int i=1;i<=s.size()-x;i++)
    {
        string z=s.substr(x,i);//x开始长度为i

        path.push_back(z);
        dfs(x+i,s);
        path.pop_back();
    }
}
    vector<vector<string>> partition(string s) {
        dfs(0,s);
        return ans;

    }
};

087. 复原 IP

剪枝

class Solution {
public:
 vector<string>ans;
  vector<string>path;
  int tonum(string x)
  {
      int sum=0;
      for(int i=0;i<x.size();i++)
      {
          sum=sum*10+x[i]-'0';
      }
      return sum;
  }
 bool check()
 {
     for(string x: path)
     {
         if(x.size()>3)return false;
         if(x.size()>1&&x[0]=='0')return false;//前导0
         if(tonum(x)>255)return false;//IP

     }
     return true;

 }
 void dfs(int x, string s)
 {
     if(x==s.size())
     {
         if(path.size()!=4)return ;
         if(check())
         {
             string k;
             for(string x:path)
             {
                 k+=x;
                 k+=".";
             }
             k=k.substr(0,k.size()-1);
             ans.push_back(k);
         }
     }
     for(int i=1;i<=s.size()-x;i++)
     {
         string temp=s.substr(x,i);//以x为起点 长度为i的字符串放进去
         path.push_back(temp);
         dfs(x+i,s);
         path.pop_back();
     }
 }
    vector<string> restoreIpAddresses(string s) {
        if(s.size()>4*3)return ans;//数据范围3000吓唬谁呢 255 255 255 255
        dfs(0,s);//下标
        return ans;
    }
};
posted @ 2022-03-23 10:17  liv_vil  阅读(22)  评论(0)    收藏  举报