Welcome to Subscribe On Youtube
3361. Shift Distance Between Two Strings
Description
You are given two strings s
and t
of the same length, and two integer arrays nextCost
and previousCost
.
In one operation, you can pick any index i
of s
, and perform either one of the following actions:
- Shift
s[i]
to the next letter in the alphabet. Ifs[i] == 'z'
, you should replace it with'a'
. This operation costsnextCost[j]
wherej
is the index ofs[i]
in the alphabet. - Shift
s[i]
to the previous letter in the alphabet. Ifs[i] == 'a'
, you should replace it with'z'
. This operation costspreviousCost[j]
wherej
is the index ofs[i]
in the alphabet.
The shift distance is the minimum total cost of operations required to transform s
into t
.
Return the shift distance from s
to t
.
Example 1:
Input: s = "abab", t = "baba", nextCost = [100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], previousCost = [1,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
Output: 2
Explanation:
- We choose index
i = 0
and shifts[0]
25 times to the previous character for a total cost of 1. - We choose index
i = 1
and shifts[1]
25 times to the next character for a total cost of 0. - We choose index
i = 2
and shifts[2]
25 times to the previous character for a total cost of 1. - We choose index
i = 3
and shifts[3]
25 times to the next character for a total cost of 0.
Example 2:
Input: s = "leet", t = "code", nextCost = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], previousCost = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
Output: 31
Explanation:
- We choose index
i = 0
and shifts[0]
9 times to the previous character for a total cost of 9. - We choose index
i = 1
and shifts[1]
10 times to the next character for a total cost of 10. - We choose index
i = 2
and shifts[2]
1 time to the previous character for a total cost of 1. - We choose index
i = 3
and shifts[3]
11 times to the next character for a total cost of 11.
Constraints:
1 <= s.length == t.length <= 105
s
andt
consist only of lowercase English letters.nextCost.length == previousCost.length == 26
0 <= nextCost[i], previousCost[i] <= 109
Solutions
Solution 1
-
class Solution { public long shiftDistance(String s, String t, int[] nextCost, int[] previousCost) { int m = 26; long[] s1 = new long[(m << 1) + 1]; long[] s2 = new long[(m << 1) + 1]; for (int i = 0; i < (m << 1); i++) { s1[i + 1] = s1[i] + nextCost[i % m]; s2[i + 1] = s2[i] + previousCost[(i + 1) % m]; } long ans = 0; for (int i = 0; i < s.length(); i++) { int x = s.charAt(i) - 'a'; int y = t.charAt(i) - 'a'; long c1 = s1[y + (y < x ? m : 0)] - s1[x]; long c2 = s2[x + (x < y ? m : 0)] - s2[y]; ans += Math.min(c1, c2); } return ans; } }
-
class Solution { public: long long shiftDistance(string s, string t, vector<int>& nextCost, vector<int>& previousCost) { int m = 26; vector<long long> s1((m << 1) + 1); vector<long long> s2((m << 1) + 1); for (int i = 0; i < (m << 1); ++i) { s1[i + 1] = s1[i] + nextCost[i % m]; s2[i + 1] = s2[i] + previousCost[(i + 1) % m]; } long long ans = 0; for (int i = 0; i < s.size(); ++i) { int x = s[i] - 'a'; int y = t[i] - 'a'; long long c1 = s1[y + (y < x ? m : 0)] - s1[x]; long long c2 = s2[x + (x < y ? m : 0)] - s2[y]; ans += min(c1, c2); } return ans; } };
-
class Solution: def shiftDistance( self, s: str, t: str, nextCost: List[int], previousCost: List[int] ) -> int: m = 26 s1 = [0] * (m << 1 | 1) s2 = [0] * (m << 1 | 1) for i in range(m << 1): s1[i + 1] = s1[i] + nextCost[i % m] s2[i + 1] = s2[i] + previousCost[(i + 1) % m] ans = 0 for a, b in zip(s, t): x, y = ord(a) - ord("a"), ord(b) - ord("a") c1 = s1[y + m if y < x else y] - s1[x] c2 = s2[x + m if x < y else x] - s2[y] ans += min(c1, c2) return ans
-
func shiftDistance(s string, t string, nextCost []int, previousCost []int) (ans int64) { m := 26 s1 := make([]int64, (m<<1)+1) s2 := make([]int64, (m<<1)+1) for i := 0; i < (m << 1); i++ { s1[i+1] = s1[i] + int64(nextCost[i%m]) s2[i+1] = s2[i] + int64(previousCost[(i+1)%m]) } for i := 0; i < len(s); i++ { x := int(s[i] - 'a') y := int(t[i] - 'a') z := y if y < x { z += m } c1 := s1[z] - s1[x] z = x if x < y { z += m } c2 := s2[z] - s2[y] ans += min(c1, c2) } return }
-
function shiftDistance(s: string, t: string, nextCost: number[], previousCost: number[]): number { const m = 26; const s1: number[] = Array((m << 1) + 1).fill(0); const s2: number[] = Array((m << 1) + 1).fill(0); for (let i = 0; i < m << 1; i++) { s1[i + 1] = s1[i] + nextCost[i % m]; s2[i + 1] = s2[i] + previousCost[(i + 1) % m]; } let ans = 0; const a = 'a'.charCodeAt(0); for (let i = 0; i < s.length; i++) { const x = s.charCodeAt(i) - a; const y = t.charCodeAt(i) - a; const c1 = s1[y + (y < x ? m : 0)] - s1[x]; const c2 = s2[x + (x < y ? m : 0)] - s2[y]; ans += Math.min(c1, c2); } return ans; }