1->求一个字符串所包含的回文字符子串
解题方法:递归深度搜索
vector<vector<string> >partition(string s){
vector<vector<string> > result;
vector<string> path;
helper(s,path,result,0,1);
return result;
}
void helper(string &s,vector<string>& path,vector<vector<string> >&result,int prev,int start){
if(start==s.size()){
if(isPalondrome(s,prev,start-1)){
path.push_back(s.substr(prev,start-prev)); result.push_back(path); path.pop_back();
}
return ;
}
helper(s,path,result,prev,start+1);
if(isPalindrome(s,prev,start-1)){
path.push_back(s,substr(prev,start-prev));
helper(s,path,result,start,start+1);
path.pop_back();
}
}
2->一个机器人试图从矩阵的对角线一端走到对角线的另一端,求出所有的路径和,每次只能移动一格,并且只能向右或者下移动
int uniquePaths(int m,int n){
if(m<1 || n<1) return 0; //终止条件
if(m==1 && n==1) return 1;
return unqiuePaths(m-1,n)+unqiuePaths(m,n-1);
}
3->针对上面一题加上障碍的路径条数
int uniquePathsWithObstacles(vector<vector<int> >&obstacleGrid){
int m=obstacleGrid.size(); int n=obstacleGrid[0].size();
return helper(obstacleGrid,m,n);
}
int helper(vector<vector<int> >&obstacleGrid, int x,int y){
if(x<1 || y<1) return 0;
if(obstacleGrid[x-1][y-1]) return 0;
if(x==1 && y==1) return 1;
return helper(obstacleGrid,x-1,y)+helper(obstacleGrid,x,y-1);
}
4->IP地址的保存,例如:一个串25525511135 返回【255.255.11.135 , 255.255.111.35】
解题方法深度搜索
vector <string> restoreIPAddressess(string s){
vector<string> result;
string ip;
helper(s,0,0,ip,result);
return result;
}
void helper(string s,int start,int step,string ip,vector<string> &result){
if(start==s.size() && step==4){
ip=resize(ip.size()-1); result.push_back(ip); return ;
}
if(s.size()-start>(4-step)*3) return ;
if(s.size()-start<4-step) return;
int num=0;
for(int i=start;i<start+3;i++){
num=num*10+(s[i]-'0');
if(num==0) break;
if(num<=255){
ip+=s[i]; helper(s,i+1,step+1,ip+'*',result);
}
}
}
5->求出一个数组中和满足某个值的数的组合
vector <vector<int> > combinationSum(vector<int > &nums,int target){
sort(num.begin(),num.end());
vector<vector<int> > result;
vector<int> intermediate; //中间结果值
helper(nums,target,0,intermeduate,result);
return result;
}
void helper(vector<int>& nums,int gap,int start,vector<int>& intermediate,vector<vector<int> >&result){
if(grap==0){
result.push_back(intermediate); return ;
}
for(int i=start;i<num.size();i++){
if(grap<num[i]) return ;
intermediate.push_back(num[i]);
helper(nums,grap-nums[i],i,intermediate,result);
intermediate.pop_back();
}
}
6->在上一题的基础上加上一个出现重复数值的情况
vector <vector<int> > combinationSum2(vector<int> &nums,int target){
sort(nums.begin(),nums.end());
vector<vector<int> > result; vector<int> intermediate;
helper(nums,target,0,intermediate,result);
return result;
}
void helper(vector<int> &nums,int grap,int start,vector<int> &intermediate,vector<int> &result){
if(gap==0){
result.push_back(intermediate); return ;
}
int previous=-1;
for(int i=start; i<nums.size();i++){
if(prev==num[i]) return ;
if(grap<num[i]) return;
prev=num[i];
intermediate.push_back(nums[i]); helper(nums,grap-num[i],i+1,intermediate,result);
intermediate.pop_back();
}
}
7->输出n对括号的不同组合方式
vector <string> generateParenthesis(int n){
vector<string> result;
if(n>0) generate(n,"",0,0,result);
return result;
}
void generate(int n,string s,int l,int r,vector<string>&result){
if(l==n){
result.push_back(s.append(n-r,')')); return ;
}
generate(n,s+'(',l+1,r,result);
if(l>r) generate(n,s+')',l,r+1,result);
}
8->数独问题
bool solveSudoku(vector<vector<char>> &board){
for(int i=0;i<9;i++)
for(int j=0;j<9;j++){
if(board[i][j]=='.'){
for(int k=0;k<9;k++){
board[i][j]='1'+k;
if(isValid(board,i,j) && solveSudoku(board)) return true;
board[i][j]='.';
}
return false;
}
}
return true;
}
bool isValid(vector<vector<char> >&board,int x,int y){
for(int i=0;i<9;i++) if(i!=x &&board[x][y]==board[i][y]) return false;
for(int j=0;j<9;j++) if(j!=y && board[x][y]==board[x][j]) return false;
for(i=3*(x/3);i<3*(x/3+1);i++)
for(int j=3*(y/3);j<3*(y/3+1);j++)
if((i!=x || j!=y) && boardp[i][j]==board[x][y]) return false;
return true;
}
10->单词查找
bool exit(vector<vector<char> >&board,string word){
int m=board.size(); int n=board[0].size();
vector<vector<bool> > visited(m,vector<bool>(n,false));
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(helper(board,word,0,i,j,visited)) return true;
return false;
}
bool helper (const vector<vector<char> >&board,const string &word,int index,int x,int y,vector<vector<bool> >&visited){
if(index==word.size()) return true;
if(x<0 || y<0 ||x>=board.size() ||y>=board[0].size()) return false;
if(visited[x][y]) return false;
if(board[x][y]!=word[index]) return false;
visited[x][y]=true;
bool ret=helper(x-1,y)||helper(x,y-1)||()||(); //四个方向查找
visited[x][y]=true;
retuurn ret;
}