zoukankan      html  css  js  c++  java
  • 深度优先搜索+递归

      一般涉及到数学中的组合求解的问题一般使用的问题,可以通过修改dfs算法+递归进行相应的求解。

      此问题的 解法一般是进行对给出的 字符串进行深度搜索,需要处理各种边界条件,同时需要准确的判定出递归的终止条件。

      这类问题一般是大致上相同,主要是处理边界条件的不同。

      下面例题为leetcode上一道经典例题。

      此问题的边界条件是:

      1.ip每一段的大小最多为3

      2.ip每一段的大小需要检验其合理性,不能大于255,同时每一段需要有值。

      3.一共需要划分4段。

      代码:

      

      1 #include <iostream>
      2 #include <string>
      3 #include <vector>
      4 #include <list>
      5 using namespace std;
      6 //给出一个包含数字的字符串,给出可能的ip组合
      7 //应该使用dfs+递归实现
      8 
      9 //用来保存运算的结果
     10 
     11 string changeToString(vector<string>path)
     12 {
     13     string str = "";
     14     auto it1 = path.begin();
     15     auto it2 = path.end();
     16     while (it1 != it2)
     17     {
     18         str += (*it1);
     19         //添加上“."
     20         str += ".";
     21         ++it1;
     22     }
     23     //去除最后的“."
     24     int length = str.length();
     25     str = str.substr(0, length - 1);
     26     return str;
     27 }
     28 
     29 bool isAvailable(string out)
     30 {
     31 
     32     int length = out.length();
     33     if (length == 0)
     34         return false;
     35     if (length > 1 && out[0] == '0')
     36         return false;
     37     int num = atoi(out.c_str());
     38     if (num <0 || num >= 256)
     39         return false;
     40     return true;
     41 }
     42 
     43 void dfs(vector<string>&result, string s, int pos, vector<string>&path)
     44 {
     45     if (path.size() == 4)
     46     {
     47         if (pos != s.length())
     48             return;
     49         else
     50         {
     51             //将path转换成string 添加到result中
     52             result.push_back(changeToString(path));
     53             return;
     54         }
     55     }
     56     else
     57     {
     58         for (int i = pos; i < s.length() && i < pos + 3; i++)
     59         {
     60             //开始递归过程
     61             string out = s.substr(pos, i-pos+1);
     62             if (isAvailable(out))
     63             {
     64                 path.push_back(out);
     65                 dfs(result, s, i + 1, path);
     66                 //当处理完之后将vector中最后一个元素pop
     67                 path.pop_back();
     68             }
     69 
     70         }
     71     }
     72 
     73 }
     74 
     75 vector<string> restoreIpAddresses(string s)
     76 {
     77     int length = s.length();
     78     //用来保存输出的结果
     79     vector<string> result;
     80     //判断长度是否符合要求
     81     if (length == 0 || length < 4 || length>12)
     82         return result;
     83 
     84     //用来保存每一个可能的ip组合
     85     vector<string> path;
     86     //调用dfs处理函数
     87     dfs(result, s, 0, path);
     88     return result;
     89 
     90 }
     91 
     92 int main()
     93 {
     94     string str;
     95     vector<string> list;
     96     cin >> str;
     97     list=restoreIpAddresses(str);
     98     auto it1 = list.begin();
     99     auto it2 = list.end();
    100     while (it1 != it2)
    101     {
    102         cout << *it1 << endl;
    103         ++it1;
    104     }
    105     return 0;
    106 }

      运行结果:

      

  • 相关阅读:
    mysql性能优化
    jdbc connectoin timeout
    java thread dump
    sso实现原理
    api的防重放机制
    java各版本新特性总结
    sql区分大小写的查询
    按分数排名
    MySql常用语句
    mysql之explain用法
  • 原文地址:https://www.cnblogs.com/wangshi2019/p/10584457.html
Copyright © 2011-2022 走看看