日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode 87 Scramble String

發布時間:2023/12/8 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode 87 Scramble String 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


思路:我成功地寫出了如果只修改一次的話,判斷是否是scramble string的方法。但很可惜,這邊修改的節點可以是多個,我覺得我這種方法繼續寫下去應該是可以實現題目要求的,但是我想了好久,不會哈哈哈。我猜應該用recursive的方法來繼續寫下去?我也不太確定。但是我真的是太不喜歡recursive方法,哎但是,好像dfs,dp都和recursion有著一點關系。真得好好練練。我看了high votes answer,發現人家也是recursive的方法。真的我看懂他這個代碼都花了一個多小時吧。煩死了,真的是花時間。其實我感覺自己還沒有理解透他的代碼。我看是看得懂,也明白為什么要這樣recursion。我指的沒理解透是我沒搞清楚他怎么理出這樣一種recursive的方法。他是從哪個點切入的,才發現可以用這種方式解題。就是要從他的code反推,看他是怎么發現這樣一種思路的。關于這一點我還沒搞透。所以這一題我還是標記為attempted吧,希望以后題目做多了再回去看這道題,可以豁然開朗。下面我給出他的代碼,以及其背后的思路。以下思路取自:https://leetcode.wang/leetCode-87-Scramble-String.html

思路:
開始的時候,由于給出的圖示很巧都是平均分的,我以為只能平均分字符串,看了這里,明白其實可以任意位置把字符串分成兩部分,這里需要注意一下。

這道題很容易想到用遞歸的思想去解,假如兩個字符串 great 和 rgtae。考慮其中的一種切割方式。

第 1 種情況:S1 切割為兩部分,然后進行若干步切割交換,最后判斷兩個子樹分別是否能變成 S2 的兩部分。

第 2 種情況:S1 切割并且交換為兩部分,然后進行若干步切割交換,最后判斷兩個子樹是否能變成 S2 的兩部分。

上邊只是一種切割方式(以e為切割點,切割點為2,因為indexof(e)= 2),這邊只是展示一下正確的切割點,但在真實的情況下,我們需要從0開始遍歷所有的切割點。
代碼:

public boolean isScramble(String s1, String s2) {if (s1.length() != s2.length()) {return false;}if (s1.equals(s2)) {return true;}//判斷兩個字符串每個字母出現的次數是否一致int[] letters = new int[26];for (int i = 0; i < s1.length(); i++) {letters[s1.charAt(i) - 'a']++;letters[s2.charAt(i) - 'a']--;}//如果兩個字符串的字母出現不一致直接返回 falsefor (int i = 0; i < 26; i++) {if (letters[i] != 0) {return false;}}//遍歷每個切割位置for (int i = 1; i < s1.length(); i++) {//對應情況 1 ,判斷 S1 的子樹能否變為 S2 相應部分if (isScramble(s1.substring(0, i), s2.substring(0, i)) && isScramble(s1.substring(i), s2.substring(i))) {return true;}//對應情況 2 ,S1 兩個子樹先進行了交換,然后判斷 S1 的子樹能否變為 S2 相應部分if (isScramble(s1.substring(i), s2.substring(0, s2.length() - i)) &&isScramble(s1.substring(0, i), s2.substring(s2.length() - i)) ) {return true;}}return false; }

最后我還是想展示一下我殘缺的代碼,就是只需修改一次的。畢竟寫都寫了,po一下還是要的哈哈哈。

class Solution {public boolean isScramble(String s1, String s2) {if(s1.length() == 1){return s1.equals(s2); }// get all the possible non-leaf nodes(string)int len1 = s1.length();List<String> list = new ArrayList();List<String> resList = new ArrayList();for(int i = 0; i < len1 - 1; i++){for(int j = i + 1; j < len1; j++){list.add(s1.substring(i,j+1));}}// for each non-ledf node, compute its all possible scramble stringsfor(int i = 0; i < list.size(); i++){String s = list.get(i);for(int j = 0; j < s.length(); j++){int idx = s1.indexOf(s);String trans = s.substring(j+1) + s.substring(0,j+1);String completeTrans = s1.substring(0,idx) + trans + s1.substring(idx+trans.length()) ;resList.add(completeTrans);}}// judge if s2 is a valid scramble string of s1return resList.contains(s2);} }

總結:

  • 兩個字符相減代表其ascii碼相減
  • 好好看好好學好好理解recursive methods
  • 總結

    以上是生活随笔為你收集整理的Leetcode 87 Scramble String的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。