Problem:
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
For example, given s = "aab"
,
Return
[ ["aa","b"], ["a","a","b"] ]
借用了最大公共字串的思想。
Solution:
public class Solution {
byte[][] compareMatrix;
String gString;
public List<List<String>> partition(String s) {
if(s==null||s.equals(""))
{
return new ArrayList<List<String>>();
}
compareMatrix = new byte[s.length()][s.length()];
gString = s;
for(int i=0;i<s.length();i++)
{
for(int j=0;j<s.length();j++)
{
if(s.charAt(s.length()-1-i)==s.charAt(j))
{
if(i==0||j==0)
compareMatrix[i][j] = 1;
else
compareMatrix[i][j] = (byte) (compareMatrix[i-1][j-1]+1);
}
}
}
return subPalindrome(0);
}
private List<List<String>> subPalindrome(int j)
{
List<List<String>> relList = new ArrayList<List<String>>();
for(int k=j;k<gString.length();k++)
{
if(compareMatrix[gString.length()-1-j][k]>k-j)
{
if(k==gString.length()-1)
{
ArrayList<String> temp = new ArrayList<>();
temp.add(gString.substring(j,k+1));
relList.add(temp);
}
else
{
List<List<String>> llist = subPalindrome(k+1);
Iterator<List<String>> it = llist.iterator();
while(it.hasNext())
{
List<String> lstr = it.next();
lstr.add(0,gString.substring(j,k+1));
relList.add(lstr);
}
}
}
}
return relList;
}
}
byte[][] compareMatrix;
String gString;
public List<List<String>> partition(String s) {
if(s==null||s.equals(""))
{
return new ArrayList<List<String>>();
}
compareMatrix = new byte[s.length()][s.length()];
gString = s;
for(int i=0;i<s.length();i++)
{
for(int j=0;j<s.length();j++)
{
if(s.charAt(s.length()-1-i)==s.charAt(j))
{
if(i==0||j==0)
compareMatrix[i][j] = 1;
else
compareMatrix[i][j] = (byte) (compareMatrix[i-1][j-1]+1);
}
}
}
return subPalindrome(0);
}
private List<List<String>> subPalindrome(int j)
{
List<List<String>> relList = new ArrayList<List<String>>();
for(int k=j;k<gString.length();k++)
{
if(compareMatrix[gString.length()-1-j][k]>k-j)
{
if(k==gString.length()-1)
{
ArrayList<String> temp = new ArrayList<>();
temp.add(gString.substring(j,k+1));
relList.add(temp);
}
else
{
List<List<String>> llist = subPalindrome(k+1);
Iterator<List<String>> it = llist.iterator();
while(it.hasNext())
{
List<String> lstr = it.next();
lstr.add(0,gString.substring(j,k+1));
relList.add(lstr);
}
}
}
}
return relList;
}
}