題目連結:
題目意譯:
給定一個字串 word 並且你可以在任意處插入任意個字母 'a' 、 'b' 或是 'c'。回傳讓 word 變成合法字串最少所需要插入的字母數。
一個字串如果可以藉由若干個字串 "abc" 串接在一起而形成,則稱為是「合法的」。
限制:
1 ≦ word.length ≦ 50
word 只由 'a' 、 'b' 和 'c' 所組成。
範例測資:
範例 1:
輸入: word = "b"
輸出: 2
解釋: 在 'b' 之前插入字母 'a' 並在 'b' 之後插入字母 'c' 來得到一個合法字串 "abc"。
範例 2:
輸入: word = "aaa"
輸出: 6
解釋:在每一個 'a' 之後插入字母 'b' 和 'c' 來得到一個合法字串 "abcabcabc"。
範例 3:
輸入: word = "abc"
輸出: 0
解釋: word 已經合法了。不需要額外的修改。
解題思維:
掃過 word 並紀錄「現在」要是什麼字母並判斷即可。
假設現在你看到的字母之「值」是 c(用 0 、 1 、 2 依序替換 'a' 、 'b' 、 'c',方便計算),而現在的字母值應該要是 x。
如果 c == x,代表著什麼都不用做;
如果 c < x(例如說,現在要是 'b' 但在 word 中看到了 'a'),則需要特別加入字母值 x ~ 2 以及字母值 0 ~ c - 1 的字母(不需要 c 本身,因為已經有了),即總數為 (3 - x) + c。並令 x = c;
如果 c > x,則代表著我們需要加入字母值 x ~ c - 1 的字母,因此總數為 c - x。並令 x = c。
而看完每一個字母之後,把 x 移到「下一個」字母。因此將 x 之值設為 (x + 1) % 3,其中「%」為模運算。
掃完 word 之後如果 x != 0,則代表著還要額外補 'b' 或 'c' 在結尾,因此插入字母總數還要額外加上 3 - x;反之,如果 x == 0,則不需要補。這邊整體可以簡化為統一加上 (3 - x) % 3。
最後以上過程所有插入的字母之總數即為所求。
(注:範例程式碼中將 x 移往下一個字母的時間點跟上面陳述的不一樣,因此會有些許調整。)
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。