2060. 同源字符串檢測

2060. 同源字符串檢測

原字符串由小寫字母組成,可以按下述步驟編碼:

任意將其 分割 為由若干 非空 子字符串組成的一個 序列 。
任意選擇序列中的一些元素(也可能不選擇),然后將這些元素替換為元素各自的長度(作為一個數字型的字符串)。
重新 順次連接 序列,得到編碼后的字符串。
例如,編碼 “abcdefghijklmnop” 的一種方法可以描述為:

將原字符串分割得到一個序列:[“ab”, “cdefghijklmn”, “o”, “p”] 。
選出其中第二個和第三個元素并分別替換為它們自身的長度。序列變為 [“ab”, “12”, “1”, “p”] 。
重新順次連接序列中的元素,得到編碼后的字符串:“ab121p” 。
給你兩個編碼后的字符串 s1 和 s2 ,由小寫英文字母和數字 1-9 組成。如果存在能夠同時編碼得到 s1 和 s2 原字符串,返回 true ;否則,返回 false。

注意:生成的測試用例滿足 s1 和 s2 中連續數字數不超過 3 。

示例 1:輸入:s1 = "internationalization", s2 = "i18n"
輸出:true
解釋:"internationalization" 可以作為原字符串
- "internationalization" -> 分割:      ["internationalization"]-> 不替換任何元素-> 連接:      "internationalization",得到 s1
- "internationalization"-> 分割:      ["i", "nternationalizatio", "n"]-> 替換:      ["i", "18",                 "n"]-> 連接:      "i18n",得到 s2
示例 2:輸入:s1 = "l123e", s2 = "44"
輸出:true
解釋:"leetcode" 可以作為原字符串
- "leetcode" -> 分割:       ["l", "e", "et", "cod", "e"]-> 替換:       ["l", "1", "2",  "3",   "e"]-> 連接:       "l123e",得到 s1
- "leetcode" -> 分割:       ["leet", "code"]-> 替換:       ["4",    "4"]-> 連接:       "44",得到 s2
示例 3:輸入:s1 = "a5b", s2 = "c5b"
輸出:false
解釋:不存在這樣的原字符串
- 編碼為 s1 的字符串必須以字母 'a' 開頭
- 編碼為 s2 的字符串必須以字母 'c' 開頭
示例 4:輸入:s1 = "112s", s2 = "g841"
輸出:true
解釋:"gaaaaaaaaaaaas" 可以作為原字符串
- "gaaaaaaaaaaaas"-> 分割:       ["g", "aaaaaaaaaaaa", "s"]-> 替換:       ["1", "12",           "s"]-> 連接:       "112s",得到 s1
- "gaaaaaaaaaaaas"-> 分割:       ["g", "aaaaaaaa", "aaaa", "s"]-> 替換:       ["g", "8",        "4",    "1"]-> 連接         "g841",得到 s2
示例 5:輸入:s1 = "ab", s2 = "a2"
輸出:false
解釋:不存在這樣的原字符串
- 編碼為 s1 的字符串由兩個字母組成
- 編碼為 s2 的字符串由三個字母組成

提示:

  • 1 <= s1.length, s2.length <= 40
  • s1 和 s2 僅由數字 1-9 和小寫英文字母組成
  • s1 和 s2 中連續數字數不超過 3

解題思路

使用深度優先搜索,加上記憶化搜索
每一次遞歸i, j, d,代表s1的前i個與s2的前j個字符進行匹配后,二者之間長度的差值為d

  • d>0,說明之前匹配的情況是s2的長度是大于s1的,所以s1要使用字母或者展開數字來填充差距
  • d<0,說明之前匹配的情況是s1的長度是大于s2的,所以s2要使用字母或者展開數字來填充差距
  • d==0,說明s1和s2的前面那部分是沒有差值的
    每次遞歸根據i,j,d的值分類討論
  1. 當i == n1 && j == n2 && d == 0,遞歸的邊界,s1和s2完成匹配了
  2. 當d == 0 && i < n1 && j < n2 && s1[i] == s2[j] ,說明當前兩個字符串的當前位置都是同樣的字母或者數字,并且之前的匹配沒有出現差值。
  3. d > 0 && i < n1 && isalpha(s1[i])或者d < 0 && j < n2 && isalpha(s2[j]),說明s1和s2之前匹配的長度出現了差值,可以嘗試用一個字母填補1個長度差值
  4. 如果d>0或者d<0,說明之前的匹配出現了長度差值,而當前字符又為數字,可以利用數字去填充之前的長度差值

代碼

class Solution {
public:char dp[41][41][2005];int n1, n2;string s1, s2;bool possiblyEquals(string s1, string s2) {this->n1 = s1.size();this->n2 = s2.size();this->s2 = s2;this->s1 = s1;memset(dp, -1, sizeof(dp));return  dfs(0, 0, 0);}bool dfs(int i, int j, int d) {if (dp[i][j][d + 1000] != -1)return dp[i][j][d + 1000];char res = i == n1 && j == n2 && d == 0;if (!res) res |= (d == 0 && i < n1 && j < n2 && s1[i] == s2[j] && dfs(i + 1, j + 1, 0));if (!res) res |= (d > 0 && i < n1 && isalpha(s1[i]) && dfs(i + 1, j, d - 1));if (!res) res |= (d < 0 && j < n2 && isalpha(s2[j]) && dfs(i, j + 1, d + 1));if (!res){int sum=0;if (d>=0){for (int k = i; k < n1&&isdigit(s1[k]); ++k) {sum=sum*10+s1[k]-'0';res|=dfs(k+1,j,d-sum);}}sum=0;if(d<=0){for (int k = j; k < n2&isdigit(s2[k]); ++k) {sum=sum*10+s2[k]-'0';res|=dfs(i,k+1,d+sum);}}}return dp[i][j][d+1000]=res;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389828.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389828.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389828.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue中的data用return返回

為什么在大型項目中data需要使用return返回數據呢&#xff1f;答&#xff1a;不使用return包裹的數據會在項目的全局可見&#xff0c;會造成變量污染&#xff1b;使用return包裹后數據中變量只在當前組件中生效&#xff0c;不會影響其他組件。 1、在簡單的vue實例中看到的Vue實…

白褲子變粉褲子怎么辦_使用褲子構建構建數據科學的monorepo

白褲子變粉褲子怎么辦At HousingAnywhere, one of the first major obstacles we had to face when scaling the Data team was building a centralised repository that contains our ever-growing machine learning applications. Between these projects, many of them shar…

ubuntu+anaconda+tensorflow 及相關問題

配置tensorflow部分參考&#xff1a;https://blog.csdn.net/XUTIAN1129/article/details/78997633 裝完anaconda, source ~/.bashrc后, 可以直接 pip install tensorflow-gpu , 珍愛生命&#xff0c;遠離bazel。但想要c/c調用tf的時候遠離不了&#xff0c;還是得bazel編譯安裝t…

2022. 將一維數組轉變成二維數組

2022. 將一維數組轉變成二維數組 給你一個下標從 0 開始的一維整數數組 original 和兩個整數 m 和 n 。你需要使用 original 中 所有 元素創建一個 m 行 n 列的二維數組。 original 中下標從 0 到 n - 1 &#xff08;都 包含 &#xff09;的元素構成二維數組的第一行&#xf…

支持向量機SVM算法原理及應用(R)

支持向量機SVM算法原理及應用&#xff08;R&#xff09; 2016年08月17日 16:37:25 閱讀數&#xff1a;22292更多 個人分類&#xff1a; 數據挖掘實戰應用版權聲明&#xff1a;本文為博主原創文章&#xff0c;轉載請注明來源。 https://blog.csdn.net/csqazwsxedc/article/detai…

mad離群值_全部關于離群值

mad離群值An outlier is a data point in a data set that is distant from all other observations. A data point that lies outside the overall distribution of the dataset. Or in a layman term, we can say, an outlier is something that behaves differently from th…

2057. 值相等的最小索引

2057. 值相等的最小索引 給你一個下標從 0 開始的整數數組 nums &#xff0c;返回 nums 中滿足 i mod 10 nums[i] 的最小下標 i &#xff1b;如果不存在這樣的下標&#xff0c;返回 -1 。 x mod y 表示 x 除以 y 的 余數 。 示例 1&#xff1a;輸入&#xff1a;nums [0,1,2…

SpringBoot中各配置文件的優先級及加載順序

我們在寫程序的時候會碰到各種環境(開發、測試、生產)&#xff0c;因而&#xff0c;在我們切換環境的時候&#xff0c;我們需要手工切換配置文件的內容。這大大的加大了運維人員的負擔&#xff0c;同時會帶來一定的安全隱患。 為此&#xff0c;為了能更合理地重寫各屬性的值&am…

青年報告_了解青年的情緒

青年報告Youth-led media is any effort created, planned, implemented, and reflected upon by young people in the form of media, including websites, newspapers, television shows, and publications. Such platforms connect writers, artists, and photographers in …

post提交參數過多時,取消Tomcat對 post長度限制

1.Tomcat 默認的post參數的最大大小為2M&#xff0c; 當超過時將會出錯&#xff0c;可以配置maxPostSize參數來改變大小。 從 apache-tomcat-7.0.63 開始&#xff0c;參數 maxPostSize 的含義就變了&#xff1a; 如果將值設置為 0&#xff0c;表示 POST 最大值為 0&#xff0c;…

2048. 下一個更大的數值平衡數

2048. 下一個更大的數值平衡數 如果整數 x 滿足&#xff1a;對于每個數位 d &#xff0c;這個數位 恰好 在 x 中出現 d 次。那么整數 x 就是一個 數值平衡數 。 給你一個整數 n &#xff0c;請你返回 嚴格大于 n 的 最小數值平衡數 。 示例 1&#xff1a;輸入&#xff1a;n …

bzoj1222: [HNOI2001]產品加工

一開始以為是費用流。。然后搞不出來&#xff0c;路牌是DP&#xff0c;想一想 f[i][j]表示加工到第i個產品&#xff0c;然后A用時j&#xff0c;B用時的最小值 那么f[i][j]max(f[i-1][j-a[i]],f[i-1][j]b[i],f[i-1][j-c[i]]c[i]) 滾掉一維美滋滋 #include<cstdio> #includ…

map(平均平均精度_客戶的平均平均精度

map(平均平均精度Disclaimer: this was created for my clients because it’s rather challenging to explain such a complex metric in simple words, so don’t expect to see much of math or equations here. And remember that I try to keep it simple.免責聲明 &#…

Sublime Text 2搭建Go開發環境,代碼提示+補全+調試

本文在已安裝Go環境的前提下繼續。 1、安裝Sublime Text 2 2、安裝Package Control。 運行Sublime&#xff0c;按下 Ctrl&#xff08;在Tab鍵上邊&#xff09;&#xff0c;然后輸入以下內容&#xff1a; import urllib2,os,hashlib; h 7183a2d3e96f11eeadd761d777e62404 e330…

629. K個逆序對數組

629. K個逆序對數組 給出兩個整數 n 和 k&#xff0c;找出所有包含從 1 到 n 的數字&#xff0c;且恰好擁有 k 個逆序對的不同的數組的個數。 逆序對的定義如下&#xff1a;對于數組的第i個和第 j個元素&#xff0c;如果滿i < j且 a[i] > a[j]&#xff0c;則其為一個逆…

zookeeper、hbase常見命令

a) Zookeeper&#xff1a;幫助命令-help i. ls /查看zk下根節點目錄 ii. create /zk_test my_data//在測試集群沒有創建成功 iii. get /zk_test my_data//獲取節點信息 iv. set / zk_test my_data//更改節點相關信息 v. delete /zk_test//刪除節點信…

鮮活數據數據可視化指南_數據可視化實用指南

鮮活數據數據可視化指南Exploratory data analysis (EDA) is an essential part of the data science or the machine learning pipeline. In order to create a robust and valuable product using the data, you need to explore the data, understand the relations among v…

2049. 統計最高分的節點數目

2049. 統計最高分的節點數目 給你一棵根節點為 0 的 二叉樹 &#xff0c;它總共有 n 個節點&#xff0c;節點編號為 0 到 n - 1 。同時給你一個下標從 0 開始的整數數組 parents 表示這棵樹&#xff0c;其中 parents[i] 是節點 i 的父節點。由于節點 0 是根&#xff0c;所以 p…

Linux lsof命令詳解

lsof&#xff08;List Open Files&#xff09; 用于查看你進程開打的文件&#xff0c;打開文件的進程&#xff0c;進程打開的端口(TCP、UDP)&#xff0c;找回/恢復刪除的文件。是十分方便的系統監視工具&#xff0c;因為lsof命令需要訪問核心內存和各種文件&#xff0c;所以需要…

史密斯臥推:杠鈴史密斯下斜臥推、上斜機臥推、平板臥推動作圖解

史密斯臥推&#xff1a;杠鈴史密斯下斜臥推、上斜機臥推、平板臥推動作圖解 史密斯臥推&#xff08;smith press&#xff09;是固定器械上完成的臥推&#xff0c;對于初級健身者來說&#xff0c;自由臥推&#xff08;啞鈴臥推、杠鈴臥推&#xff09;還不能很好地把握平衡性&…