Skip to content

Commit 3e4ee49

Browse files
committed
add 125 131
1 parent 1a79216 commit 3e4ee49

File tree

2 files changed

+162
-0
lines changed

2 files changed

+162
-0
lines changed

125.valid_palindrome.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
[To Index](/index.md)
2+
---
3+
# 125.Valid Palindrome
4+
> 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
5+
说明:本题中,我们将空字符串定义为有效的回文串。
6+
7+
```
8+
示例 1:
9+
10+
输入: "A man, a plan, a canal: Panama"
11+
输出: true
12+
示例 2:
13+
14+
输入: "race a car"
15+
输出: false
16+
```
17+
18+
难度:Easy
19+
方法:去除无关字符,大小写转换之后,再判断即可。
20+
代码如下:
21+
```
22+
class Solution {
23+
public:
24+
bool isPalindrome(string s) {
25+
int t=s.length();
26+
string tmp;
27+
for(int i=0;i<t;i++)
28+
{
29+
if(s[i]>64 && s[i]<91)
30+
tmp+=s[i]+32;
31+
else if(s[i]>96 && s[i]<123)
32+
tmp +=s[i];
33+
else if(s[i]>47 &&s[i]<58)
34+
tmp +=s[i];
35+
}
36+
// cout << tmp << endl;
37+
int n=tmp.length();
38+
for(int i=0;i<n/2;i++)
39+
{
40+
if(tmp[i]!=tmp[n-i-1]) return false;
41+
}
42+
return true;
43+
}
44+
};
45+
```

131.palindrome_partitioning.md

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
[To Index](/index.md)
2+
---
3+
# 131.Palindrome Partitioning
4+
> 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
5+
难度:Medium
6+
返回 s 所有可能的分割方案。
7+
8+
示例:
9+
```
10+
输入: "aab"
11+
输出:
12+
[
13+
["aa","b"],
14+
["a","a","b"]
15+
]
16+
```
17+
直观解决方法:递归。
18+
因为所有子数组都是回文,所以从第一个开始,找到一个回文后,将剩下的子串找出所有的可能性组合,最后再合并即可。
19+
代码如下:
20+
21+
```
22+
class Solution {
23+
public:
24+
vector<vector<string>> partition(string s) {
25+
int n=s.length(),cnt=0;
26+
vector<vector<string>> res;
27+
vector<string> ret;
28+
if (n == 1)
29+
{
30+
ret.push_back(s);
31+
res.push_back(ret);
32+
return res;
33+
}
34+
35+
vector<vector<string>> tmp;
36+
for(int i=1;i<n;i++)
37+
{
38+
string fir=s.substr(0,i);
39+
if(ispalind(fir))
40+
{
41+
tmp=merge(fir,partition(s.substr(i,n-i)));
42+
res.insert(res.end(),tmp.begin(),tmp.end());
43+
}
44+
}
45+
if(ispalind(s))
46+
{
47+
ret.push_back(s);
48+
res.push_back(ret);
49+
}
50+
return res;
51+
52+
}
53+
vector<vector<string>> merge(string a, vector<vector<string>>b)
54+
{
55+
vector<vector<string>> res;
56+
57+
for(int i=0;i<b.size();i++)
58+
{
59+
vector<string>tmp;
60+
tmp.push_back(a);
61+
tmp.insert(tmp.end(),b[i].begin(),b[i].end());
62+
res.push_back(tmp);
63+
}
64+
return res;
65+
}
66+
bool ispalind(string s)
67+
{
68+
int n=s.length();
69+
for(int i=0;i<n/2;i++)
70+
if(s[i]!=s[n-i-1]) return false;
71+
return true;
72+
}
73+
};
74+
```
75+
76+
定义了一个函数来判断是否是回文,另一个函数用来将第一个子串和剩下的回文向量合并,最后判断整个字符串是否是回文。
77+
但这样并不高效。因为运算时间比较长。
78+
提交结果的一个比较好的示例如下:
79+
80+
```
81+
class Solution {
82+
vector<vector<string>> res;
83+
84+
void DFS(string& s, int begin, vector<string>& t){
85+
if(begin>=s.length())
86+
res.push_back(t);
87+
else{
88+
t.push_back("");
89+
for(int end=begin;end<s.length();end++)
90+
if(isParl(s, begin, end)){
91+
t[t.size()-1] = s.substr(begin, end-begin+1);
92+
DFS(s, end+1, t);
93+
}
94+
t.pop_back();
95+
}
96+
}
97+
98+
99+
bool isParl(string& s, int begin, int end){
100+
// 可以用DP存储加速
101+
while(begin<end){
102+
if(s[begin]!=s[end])
103+
return false;
104+
begin++;
105+
end--;
106+
}
107+
return true;
108+
}
109+
public:
110+
vector<vector<string>> partition(string s) {
111+
vector<string> t;
112+
DFS(s, 0, t);
113+
return res;
114+
}
115+
};
116+
```
117+
采用深度优先搜索DFS,也是递归调用完成。

0 commit comments

Comments
 (0)