【Leetcode】Palindrome Partitioning

题目链接:https://leetcode.com/problems/palindrome-partitioning/

题目:

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"]
  ]

思路:

1、先得到字符串切分方案,即0~str.length-1的一个全排列,然后切分字符串,并判断是否是回文。因为在切分操作的时间复杂度为O(n^3),所以会超时,用动态规划?我不会啊.......

2、待续........

算法1:

List<List<String>> strss = new ArrayList<List<String>>();
	List<String> strs = new ArrayList<String>();
	String str = "";
	List<List<Integer>> iLists = new ArrayList<List<Integer>>();
	List<Integer> list = new ArrayList<Integer>();
	int k = 0;

	public List<List<String>> partition(String s) {
		this.k = s.length() - 1;
		this.str = s;
		dspPartition(1);
		cutStr();
		if (isPalindrome(s)) {
			List<String> test = new ArrayList<String>();
			test.add(s);
			strss.add(test);
		}
		return strss;
	}

	void dspPartition(int cur) {
		if (cur > this.k) {
			return;
		}
		for (int i = cur; i <= k; i++) {
			list.add(i);
			iLists.add(new ArrayList<Integer>(list));// 生成1~k的所有子集 即切割字符串位置方案
			dspPartition(i + 1);
			list.remove(list.size() - 1);
		}

	}

	public void cutStr() {
		for (int i = 0; i < iLists.size(); i++) {
			List<Integer> list = iLists.get(i);
			boolean flag = true;
			if (list.size() != 0) {
				for (int j = 0; j < list.size(); j++) {
					String tmp = "";
					if (j == 0) {// 0~j
						tmp = str.substring(0, list.get(j));
						if (!isPalindrome(tmp)) {
							flag = false;
						}
						strs.add(tmp);
					}
					if (j - 1 >= 0) {// j-1 ~j
						tmp = str.substring(list.get(j - 1), list.get(j));
						if (!isPalindrome(tmp)) {
							flag = false;
						}
						strs.add(tmp);
					}
					if (j == list.size() - 1) {// j~~
						tmp = str.substring(list.get(j), str.length());
						if (!isPalindrome(tmp)) {
							flag = false;
						}
						strs.add(tmp);
					}

				}
			}
			if (flag) {
				strss.add(new ArrayList<String>(strs));
			}
			strs.clear();
		}

	}

	boolean isPalindrome(String s) {
		boolean flag = true;
		int i = 0, j = s.length() - 1;
		char c[] = s.toCharArray();
		while (i < j) {
			if (c[i] != c[j]) {
				flag = false;
				break;
			} else {
				i++;
				j--;
			}
		}
		return flag;
	}


你可能感兴趣的:(【Leetcode】Palindrome Partitioning)