題目連結:
題目意譯:
你被給定一個字串 num,其中代表一個很大的整數。你同樣也被給定一個索引值從 0 開始的長度為 10 之整數陣列 change 其將數字 0 ~ 9 分別映射到其他的數字。更正式地說,數字 d 映射到數字 change[d]。
你可選擇 num 中任一子字串來變化。要變化一個子字串時,應將每個位數 num[i] 替換成 change 中對應的映射之數字(即將 num[i] 替換為 change[num[i]])。
回傳一字串代表著變化任一子字串後(可選擇不變化)的最大可能整數。
一子字串為字串中的一個連續字元序列。
限制:
1 ≦ num.length ≦ 10 ^ 5
num 只由數字 0 ~ 9 組成。
change.length == 10
0 ≦ change[d] ≦ 9
範例測資:
範例 1:
輸入: num = "132", change = [9,8,5,0,3,6,4,2,6,8]
輸出: "832"
解釋: 替換子字串 "1":
- 1 映射 change[1] = 8。
因此 "132" 變成 "832"。
"832" 為最大可被造出的整數,所以回傳它。
範例 2:
輸入: num = "021", change = [9,4,3,5,7,2,1,9,0,6]
輸出: "934"
解釋: 替換子字串 "021":
- 0 映射 change[0] = 9。
- 2 映射 change[2] = 3。
- 1 映射 change[1] = 4。
因此 "021" 變成 "934"。
"934" 為最大可被造出的整數,所以回傳它。
範例 3:
輸入: num = "5", change = [1,4,7,5,3,2,5,6,9,4]
輸出: "5"
解釋: "5" 已經是能造出的最大整數,所以回傳它。
解題思維:
由於位數長是不會改變的,因此我們可以按照字典序的概念來造出最大的整數。想法如下:
先從左至右(即高位到低位)掃到 num 中第一個映射後會變大的位置 i,即 num[i] < change[num[i]]。如果這樣的位置不存在,則我們便可以知道 num 不可能再變大了,因此直接回傳 num 即可。
反之,如果存在則我們便從位置 i 一路往右開始映射到 change[num[i]],直到碰見結尾或是有位置 i' 滿足 num[i] > change[num[i]]。此時即便後面有其他可以變大的位數存在,而因為我們只能改變一個子字串,我們只能停下映射的動作。此時的 num 即為最大可以被造出的整數,即所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。