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 };