zoukankan      html  css  js  c++  java
  • leetcode string

    1. palindrome-partitioning

    解法: 因为需要输出所有的可行解,所以采用深度优先遍历(回溯法)。输出最佳解的题目一般可以使用动态规划。

     1 class Solution {
     2 public:
     3     vector<vector<string>> partition(string s) {
     4         vector<vector<string> > res;
     5         vector<string> cur;
     6         dfs(s,cur,res);
     7         return res;
     8     }
     9     bool isPalindrome(string s){
    10             return s==string(s.rbegin(),s.rend());
    11         }
    12     void dfs(string s, vector<string> &cur, vector<vector<string> > &res){
    13         if(s==""){
    14             res.push_back(cur);
    15             return;
    16         }  
    17         for(int i=1;i<=s.length();++i){
    18             string sub = s.substr(0,i);
    19             if(isPalindrome(sub)){
    20                 cur.push_back(sub);
    21                 dfs(s.substr(i,s.length()-i),cur,res);
    22                 cur.pop_back();
    23             }
    24         }
    25     }
    26 };

    这里有一道类似的题目,不过只需输出最小分割的结果,所以使用动态规划 

    palindrome-partitioning-ii

    知识点:0,1,...,i,i+1,...,j,j+1 ,如果i~j是回文,则cut[j+1] = min(cut[j+1],cut[i]+1)

                   fill函数的作用是:将一个区间的元素都赋予val值。函数参数:fill(vec.begin(), vec.end(), val); val为将要替换的值。

                   fill_n函数的作用是:参数包括 : 一个迭代器,一个计数器以及一个值。该函数从迭代器指向的元素开始,将指定数量的元素设置为给定的值。

    class Solution {
    public:
        int minCut(string s) {
            int len = s.length();
            vector<int> mincuts(len+1);
            for(int i=0;i<=len;i++){
                mincuts[i]=i-1;
            }
            bool dp[len][len];
            fill_n(&dp[0][0],len*len,false);
            for(int j=1;j<len;j++){
                for(int i=j;i>=0;i--){
                    if(s[i]==s[j]&&(dp[i+1][j-1]||(j-i)<2)){
                        dp[i][j]=true;
                        mincuts[j+1]=min(mincuts[j+1],mincuts[i]+1);
                    }
                }
            }
            return mincuts[len];
        }
    };

    2. simplify-path

    知识点:

    https://www.cnblogs.com/propheteia/archive/2012/07/12/2588225.html

    stringstream的基本用法参考以上链接。

     1 class Solution {
     2     public:
     3         //中间是"."的情况直接去掉,是".."时删掉它上面挨着的一个路径,
     4         //如果是空的话返回"/",如果有多个"/"只保留一个。
     5         string simplifyPath(string path) {
     6             vector<string> res;
     7             stringstream ss(path);
     8             string sub;
     9             while(getline(ss,sub,'/')) {
    10                 if(sub=="." || sub=="")
    11                     continue;
    12                 else if(sub==".."&&res.size()) {
    13                     res.pop_back();
    14                 } else if(sub!="..") {
    15                     res.push_back(sub);
    16                 }
    17 
    18             }
    19             string result;
    20             for(string s:res) {
    21                 result+="/"+s;
    22             }
    23             return res.empty() ? "/":result;
    24         }
    25 };
  • 相关阅读:
    在C++中,子类重载一个操作符时,如何调用父类被重载的操作符函数
    基于AT89C51单片机的贪吃蛇电子游戏(仿真)
    七种机器内部排序的原理与C语言实现,并计算它们的比较次数与移动次数。
    使用java反射机制编写Student类并保存
    SqlServer2012导入Oracle详细案例
    TableLayoutPanel 的使用
    windows 10 & Office 2016 安装
    用过的手机集合
    windows 7 语言切换 Vistalizator
    ALV报表的颜色设计(行、列、单元格)
  • 原文地址:https://www.cnblogs.com/xctcherry/p/8995885.html
Copyright © 2011-2022 走看看