致我们终将忘记的算法(广度和深度优先搜索算法)

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;

}

发布了99 篇原创文章 · 获赞 8 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/CodeAsWind/article/details/39249895
今日推荐