摘要:題目要求現(xiàn)在有一個(gè)字符串,將分割為多個(gè)子字符串從而保證每個(gè)子字符串都是回?cái)?shù)。我們只需要找到所有可以構(gòu)成回?cái)?shù)的并且得出最小值即可。即將字符作為,將字符所在的下標(biāo)列表作為。再采用上面所說的方法,利用中間結(jié)果得出最小分割次數(shù)。
題目要求
Given a string s, partition s such that every substring of the partition is a palindrome. Return the minimum cuts needed for a palindrome partitioning of s. For example, given s = "aab", Return 1 since the palindrome partitioning ["aa","b"] could be produced using 1 cut.
現(xiàn)在有一個(gè)字符串s,將s分割為多個(gè)子字符串從而保證每個(gè)子字符串都是回?cái)?shù)。問最少需要分割多少次。
思路一:HashMap緩存這道題目的核心思想是動(dòng)態(tài)編程,假設(shè)我們已經(jīng)知道[0,1],[0,2]...[0,i-1]每個(gè)子字符串的最少分割數(shù),那么我們可以得出[0,i]子字符串的最小分割數(shù)。我們只需要從第i個(gè)字符開始往回找所有可以和第i個(gè)字符構(gòu)成回?cái)?shù),假設(shè)從第j個(gè)字符到第i個(gè)字符可以構(gòu)成回?cái)?shù)(0<=j<=i),那么以j作為分割線得到的最少分割數(shù)為cut[j-1]+1。我們只需要找到所有可以構(gòu)成回?cái)?shù)的j并且得出最小值即可。
剛開始,我選擇利用hashmap記錄所有可能構(gòu)成回?cái)?shù)的情況。即將字符作為key,將字符所在的下標(biāo)列表作為value。這樣每次遍歷一個(gè)字符時(shí),只需要從hashmap中找到該字符的所有下標(biāo)并判斷該子字符串是否是回?cái)?shù)即可。
它有一個(gè)很明顯的缺陷,就是當(dāng)出現(xiàn)大量以單一字符構(gòu)成的回?cái)?shù)時(shí),如aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbaaaaaaaaaaaaaaaaaaaaa會(huì)超時(shí)。很明顯還有更好的存儲(chǔ)中間結(jié)果的方式。
Map> cache = new HashMap >(); public int minCut(String s) { if(s==null || s.length()==0) return 0; int[] minCut = new int[s.length()+1]; minCut[0] = -1; for(int i = 0 ; i list = new ArrayList (); list.add(i); cache.put(cur, list); }else{ int max = minCut[i] + 1; List values = cache.get(cur); for(int index : values){ if(isPalindrome(s.substring(index, i+1))){ max = Math.min(max, minCut[index]+1); } } minCut[i+1] = max; values.add(i); } } return minCut[s.length()]; } public boolean isPalindrome(String subString){ if(subString.length()<=1) return true; char[] sArray = subString.toCharArray(); int left = 0, right = subString.length()-1; while(left 思路二:存儲(chǔ)中間的回?cái)?shù)結(jié)果 這里我們采用二維數(shù)組的方式來存儲(chǔ)中間的回?cái)?shù)結(jié)果。我們會(huì)新建一個(gè)boolean[s.length][s.length] isPalindrome,其中isPalindrome[i][j]代表從i開始j結(jié)束的子數(shù)組是否是回?cái)?shù)。再采用上面所說的方法,利用中間結(jié)果得出最小分割次數(shù)。
public int minCut2(String s){ if(s==null || s.length()<=1) return 0; int length = s.length(); boolean[][] isPalindrome = new boolean[length][length]; int[] result = new int[length]; char[] array = s.toCharArray(); for(int end = 0 ; end=0 ; start--){ if(array[start] == array[end]){ if(end-start<=2){ isPalindrome[start][end] = true; }else{ isPalindrome[start][end] = isPalindrome[start+1][end-1]; } } if(isPalindrome[start][end]){ if(start==0){ result[end] = 0; }else{ result[end] = Math.min(result[start-1]+1, result[end]); } } } } return result[length-1]; }
想要了解更多開發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68623.html
摘要:用表示當(dāng)前位置最少需要切幾次使每個(gè)部分都是回文。表示到這部分是回文。如果是回文,則不需重復(fù)該部分的搜索。使用的好處就是可以的時(shí)間,也就是判斷頭尾就可以確定回文。不需要依次檢查中間部分。 Given a string s, partition s such that every substring of the partition is a palindrome. Return the...
摘要:假設(shè)我們從后向前,分析到第位,開始判斷,若為,說明從第位向前到第位的子串是一個(gè)回文串,則就等于第位的結(jié)果加。然后讓繼續(xù)增大,判斷第位到最后一位的范圍內(nèi),有沒有更長的回文串,更長的回文串意味著存在更小的,用新的來替換。 Problem Given a string s, cut s into some substrings such that every substring is a p...
摘要:深度優(yōu)先搜素復(fù)雜度時(shí)間空間思路因?yàn)槲覀円祷厮锌赡艿姆指罱M合,我們必須要檢查所有的可能性,一般來說這就要使用,由于要返回路徑,仍然是典型的做法遞歸時(shí)加入一個(gè)臨時(shí)列表,先加入元素,搜索完再去掉該元素。 Palindrome Partitioning Given a string s, partition s such that every substring of the parti...
Problem Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empty list if no palindromic permutation could be form. Example Given s = aabb, return [abba,baa...
摘要:月下半旬攻略道題,目前已攻略題。目前簡單難度攻略已經(jīng)到題,所以后面會(huì)調(diào)整自己,在刷算法與數(shù)據(jù)結(jié)構(gòu)的同時(shí),攻略中等難度的題目。 Create by jsliang on 2019-07-30 16:15:37 Recently revised in 2019-07-30 17:04:20 7 月下半旬攻略 45 道題,目前已攻略 100 題。 一 目錄 不折騰的前端,和咸魚有什么區(qū)別...
閱讀 1289·2023-04-25 19:33
閱讀 1171·2021-10-21 09:39
閱讀 3644·2021-09-09 09:32
閱讀 2614·2019-08-30 10:58
閱讀 1599·2019-08-29 16:17
閱讀 873·2019-08-29 15:29
閱讀 2885·2019-08-26 11:55
閱讀 2657·2019-08-26 10:33