Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example:
Given "25525511135",
return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)
Have you been asked this question in an interview?
还是DFS,关键是只能分4段,所以需要在DFS的时候限制递归的层数,可以使用一个全局变量num来存储,进入递归函数时num++,从递归函数return后num--。
还是DFS,关键是只能分4段,所以需要在DFS的时候限制递归的层数,可以使用一个全局变量num来存储,进入递归函数时num++,从递归函数return后num--。
- int num=0;
- bool isvalid(string& s,int i,int j){
- if(i<j && s[i]=='0')
- return false;
- if(j-i+1>3)
- return false;
- else if(j-i+1==3){
- if(s[i]=='2'){
- if(s[i+1]=='5')
- return '0'<=s[i+2] && s[i+2]<='5';
- else if('0'<=s[i+1] && s[i+1]<'5')
- return true;
- else if(s[i+1]>'5' && s[i+1]<='9')
- return false;
- else
- return false;
- }
- else if(s[i]>'2' && s[i]<='9')
- return false;
- else if(s[i]=='1')
- return true;
- else
- return false;
- }
- else if(j-i+1==2)
- return '0'<=s[i] && s[i]<='9' && '0'<=s[i+1] && s[i+1]<='9';
- else
- return '0'<=s[i] && s[i]<='9';
- }
- vector<string> f(string& s,int i,int j){
- num++;
- vector<string> result;
- if(j-i+1>12)
- return result;
- if(num==4){
- if(isvalid(s,i,j))
- result.push_back(s.substr(i,j-i+1));
- }else{
- for(int k=i;k<j;k++){
- if(isvalid(s,i,k)){
- vector<string> right=f(s,k+1,j);
- for(int m=0;m<right.size();m++){
- string tmp=s.substr(i,k-i+1)+'.'+right[m];
- result.push_back(tmp);
- }
- num--;
- }
- }
- }
- return result;
- }
- vector<string> restoreIpAddresses(string s) {
-
- return f(s,0,s.size()-1);
- }
相关热门文章
给主人留下些什么吧!~~
评论热议