Given a 2D board containing 'X'
and 'O'
, capture all regions surrounded by 'X'
.
A region is captured by flipping all 'O'
s into 'X'
s in that surrounded region.
For example,
X X X X X O O X X X O X X O X X
After running your function, the board should be:
X X X X X X X X X X X X X O X X
分析:本题同Word Break II有异曲同工之妙,对单词进行划分。Word Break II的划分判断子字符是否在dict中,而本题Surrounded Regions判断子串是否为回文。此处的可以想象有一个dict,里面包含所有子串回文即可。
采用DP算法,建立[i,end]的所有回文记录表,采用DFS算法遍历所有结构。ps: DFS可采用递归,也可以不采用。
class Solution {
vector<vector<string>> retVString;
bool palin[1500][1500];
public:
vector<vector<string>> partition(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(s.size() == 0)
return vector<vector<string>>();
int leng = s.size();
for(int i = 0; i < leng; i++)
for(int j = 0; j < leng; j++)
palin[i][j] = false;
for(int i = leng-1; i >= 0; i--){
for(int j = i; j < leng; j++){
if(s[i] == s[j] && (j-i<2 || palin[i+1][j-1])){
palin[i][j] = true;
}
}
}
retVString.clear();
dfs(s, 0, vector<string>());
return retVString;
}
void dfs (string& s, int start, vector<string> palinStr)
{
if(start == s.size())
{
retVString.push_back(palinStr);
}
for(int i = start; i < s.size(); i++)
{
if(palin[start][i])
{
palinStr.push_back(s.substr(start, i - start + 1));
dfs(s, i+1, palinStr);
palinStr.pop_back();
}
}
}
};