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 };
原文地址:https://www.cnblogs.com/xctcherry/p/8995885.html