1. 程式人生 > >【leetcode】87.(Medium)Scrambling String

【leetcode】87.(Medium)Scrambling String

解題思路:
遞迴
如果一個字串s1是另外一個字串s2的scramble string的話,那必定可以找到一個劃分方式,使得s1的左右子串分別是s2左右子串的scramble string


提交程式碼:

class Solution {
    public boolean isScramble(String s1, String s2) {
    	if(s1.length()!=s2.length())	return false;
    	if(s1.length()==1) {
    		if(s1.equals(s2))	return true;
    		else return
false; } int n=s1.length(); boolean flag1,flag2,flag3,flag4; if(s1.length()==2) { flag1=(s1.charAt(0)==s2.charAt(0)); flag2=(s1.charAt(1)==s2.charAt(1)); flag3=(s1.charAt(1)==s2.charAt(0)); flag4=(s1.charAt(0)==s2.charAt(1)); if((flag1&&flag2)
||(flag3&&flag4)) return true; else return false; } //check the word package int[] letters=new int[26]; for(int i=0;i<s1.length();i++) { letters[s1.charAt(i)-'a']++; letters[s2.charAt(i)-'a']--; } for(int i=0;i<26;i++) { if(letters[
i]!=0) return false; } for(int i=1;i<s1.length();i++) { String sub11=s1.substring(0,i); String sub12=s1.substring(i,s1.length()); String sub21=s2.substring(0, i); String sub22=s2.substring(i,s2.length()); String sub23=s2.substring(0,n-i); String sub24=s2.substring(n-i); flag1=isScramble(sub11,sub21); flag2=isScramble(sub12,sub22); flag3=isScramble(sub11,sub24); flag4=isScramble(sub12,sub23); if((flag1&&flag2)||(flag3&&flag4)) return true; } return false; } }

執行結果:
在這裡插入圖片描述

相關推薦

leetcode87.MediumScrambling String

解題思路: 遞迴 如果一個字串s1是另外一個字串s2的scramble string的話,那必定可以找到一個劃分方式,使得s1的左右子串分別是s2左右子串的scramble string 提交程式碼: class Solution { public b

leetcode87.HardScrambling String

解題思路: 1.遞迴 如果一個字串s1是另外一個字串s2的scramble string的話,那必定可以找到一個劃分方式,使得s1的左右子串分別是s2左右子串的scramble string 2.DP https://blog.csdn.net/linhuanmars/article/d

leetcode50.Medium Pow(x,n)

題目連結 解題思路: 這道題的意思就是求x的n次方。 如果xx求下去,求n-1次,這樣是超時的。 我的思路是,首先求xx,然後n就可以減少2,然後求(xx)(x*x),這樣n就可以減少4… 就是n不是-1、-1、-1…這樣減下去,而是-2、-4、-8…這樣減下去 迭代cnt次後,

leetcode48.MediumRotate Image

題目連結 解題思路: 首先如果二維陣列是11或者22,直接蠻力計算; 如果是22以上,可以一圈一圈(rotate circle)地計算反轉90度之後的結果。 比如,對於下面55的陣列: 首先設定一個數組tmp將框1中的數字儲存起來, 然後計算翻轉後框1(top layer)中的

leetcode47.MediumPermutationsII

題目連結 解題思路: 參考 首先進行排序; 如果陣列中沒有重複的數字,就按照permutations的方法來做就可以了; 如果陣列中有2個重複的數字,比如[1,1,3],首先將陣列分為[1]和[1,3], 對[1,3]進行全排列有[1,3]和[3,1],在所有子全排列中

leetcode46. Medium Permutations

題目連結 解題思路: 這道題的意思就是給你一組數,其中的數字都不一樣,然後求這些數字所有的全排列組合。 比較簡單的思路是: 1.首先如果陣列中只有一個數比如2,那就只返回這個數構成的全排列; 2.如果有兩個數比如1,2那先求2全排列,可以得到[[2]], 然後在這些子全排

leetcode74. MediumSearch a 2D Matrix

解題思路: 先找到在哪一行 再找在哪個位置 提交程式碼: class Solution { public boolean searchMatrix(int[][] matrix, int target) { if(matrix.length==0||matri

leetcode73.MediumSet Matrix Zeroes

解題思路: 首先空間複雜度為O(m*n)的做法是,直接copy一套matrix來記錄 空間複雜度為O(m+n)的做法是設定陣列row[m]和column[n]來記錄每行每列的0的情況 空間複雜度為O(1)的情況就是設定兩個boolean變數,首先判定第一行和第一列是否會最終變為0,然後從第一

leetcode71.MediumSimplify Pathes

解題思路: 用一個List(pathes)維護有效路徑,遇到有效的路徑就加進pathes裡面,遇到“. .”先看pathes是否為空,為空就不管,不為空就刪掉pathes中的最後一個有效路徑。 最後將這個記錄了有效路徑的List(pathes)轉化為String的格式並返回。 提交

leetcode63. MediumUnique Pathes II

解題思路: 和Unique Path差不多 提交程式碼: class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m=obstacleGrid.lengt

leetcode92.MediumReverse Linked List II

解題思路: 這道題的意思是,有一串連結串列,將第m位到第n位翻轉過來,比如對於連結串列1-2-3-4-5,翻轉第2到第4位後就是1-4-3-2-5 題目要求只遍歷一遍連結串列 我的想法是將翻轉的部分用棧存起來,然後重新新建結點 general的做法是直接修改原連結串列的結點指向關係,比如

leetcode91.MediumDecode Ways

解題思路: 剛開始用的回溯,後來發現正解用DP,感覺好多關於字串的題都是用DP來做的 提交程式碼:回溯 class Solution { public int numDecodings(String s) { if(s.length()==0||s.ch

leetcode90.MediumSubsets II

解題思路: 和subsets I相比多了一個start位置的設定。 對於[1,2,2] 有初始子集合:[] [1] 對於nums[1]=2,由於nums[1]!=nums[0],故從0位開始疊加2並加入到結果中,可得: [] [1] [2] [1,2] 對於nums[2]=2,由於num

leetcode89.MediumGray Code

解題思路:中序Morris遍歷 我的想法是回溯,討論區直接給出了格雷碼關於i的表示式:gray[i]=i^(i/2) 即取i和i/2按位異或 提交程式碼:回溯 class Solution { public List<Integer> grayCode(in

Leetcode86.MediumPartition List

解題思路: 這道題我將list轉化為了ArrayList來做 基本思路是先將連結串列轉化為ArrayList,然後找到第一個大於等於x的數字,並記下位置flag。然後從後向前,如果是小於x的數就插入到flag的位置。比較耗時的地方是每次將數字插入到flag的位置時,ArrayList會將所有

leetcode93.MediumRestore IP Addresses

解題思路: 回溯 提交程式碼:回溯 class Solution { public List<String> restoreIpAddresses(String s) { List<String> ans=new ArrayList&

leetcode139.MediumWord Break

解題思路: DP,解法來自題目後面討論區,這道題用回溯會超時 時間複雜度:O(n^2) 空間複雜度:O(n) 提交程式碼: class Solution { public boolean wordBreak(String s, List<String> wo

leetcode96.MediumUnique Binary Search Tree

解題思路: 動態規劃 首先當結點數為1和0時設定樹的個數為1 假設我已經求出來了結點數小於n的所有結果,現在當樹的個數為n時, 樹的根節點可以是1-n。 當樹的根是i是,左邊有i-1個節點,右邊有n-i個節點,及當根是i時,可以有F[i-1]*F[n-i]顆樹 遍歷一遍1-n即可

leetcode95.MediumUnique Binary Search Tree II

解題思路: 這道題的意思是,給定n,求出所有包含1-n值的中序遍歷樹 提交程式碼: class Solution { public List<TreeNode> generateTrees(int n) { List<TreeNode> res=n

leetcode94.MediumBinary Tree Inorder Traversal

解題思路: morris遍歷 提交程式碼:回溯 class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> ans=n