1. 程式人生 > 實用技巧 >LeetCode 1540. K 次操作轉變字串 雜湊

LeetCode 1540. K 次操作轉變字串 雜湊

地址https://leetcode-cn.com/problems/can-convert-string-in-k-moves/

給你兩個字串s和t,你的目標是在 k次操作以內把字串s轉變成t。

在第 i次操作時(1 <= i <= k),你可以選擇進行如下操作:

選擇字串 s中滿足 1 <= j <= s.length且之前未被選過的任意下標 j(下標從 1 開始),並將此位置的字元切換 i次。
不進行任何操作。
切換 1 次字元的意思是用字母表中該字母的下一個字母替換它(字母表環狀接起來,所以 'z'切換後會變成 'a')。

請記住任意一個下標 j最多隻能被操作1 次。

如果在不超過 k次操作內可以把字串 s轉變成 t,那麼請你返回
true,否則請你返回false。 示例 1: 輸入:s = "input", t = "ouput", k = 9 輸出:true 解釋:第 6 次操作時,我們將 'i' 切換 6 次得到 'o' 。第 7 次操作時,我們將 'n' 切換 7 次得到 'u' 。 示例 2: 輸入:s = "abc", t = "bcd", k = 10 輸出:false 解釋:我們需要將每個字元切換 1 次才能得到 t 。我們可以在第 1 次操作時將 'a' 切換成 'b' ,但另外 2 個字母在剩餘操作中無法再轉變為 t 中對應字母。 示例 3: 輸入:s = "aab", t = "bbb", k = 27
輸出:true 解釋:第 1 次操作時,我們將第一個 'a' 切換 1 次得到 'b' 。在第 27 次操作時,我們將第二個字母 'a' 切換 27 次得到 'b' 。 提示: 1 <= s.length, t.length <= 10^5 0 <= k <= 10^9 s和t只包含小寫英文字母。

演算法1
比較兩個字串相同位置的字元差值
若相差為n 那麼操作n n+26 n+262 ...... n+26x
都可以達到效果 只需要判斷n+26*x是否會多次使用 是否超過限制k

class Solution {
public:
    int has[26];
bool
canConvertString(string s, string t, int k) { if (s.size() != t.size()) return false; for (int i = 0; i < s.size(); i++) { if (s[i] == t[i]) continue; int idx = -1; if (s[i] < t[i]) idx = t[i] - s[i]; if (s[i] > t[i]) idx = 'z' - s[i] + t[i] - 'a' + 1; has[idx]++; } for (int i = 0; i < 26; i++) { if ( ((has[i] - 1) * 26 + i) > k) return false; } return true; } };