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. If s[i] == 'z', you should replace it with 'a'. This operation costs nextCost[j] where j is the index of s[i] in the alphabet.
  • Shift s[i] to the previous letter in the alphabet. If s[i] == 'a', you should replace it with 'z'. This operation costs previousCost[j] where j is the index of s[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 shift s[0] 25 times to the previous character for a total cost of 1.
  • We choose index i = 1 and shift s[1] 25 times to the next character for a total cost of 0.
  • We choose index i = 2 and shift s[2] 25 times to the previous character for a total cost of 1.
  • We choose index i = 3 and shift s[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 shift s[0] 9 times to the previous character for a total cost of 9.
  • We choose index i = 1 and shift s[1] 10 times to the next character for a total cost of 10.
  • We choose index i = 2 and shift s[2] 1 time to the previous character for a total cost of 1.
  • We choose index i = 3 and shift s[3] 11 times to the next character for a total cost of 11.

 

Constraints:

  • 1 <= s.length == t.length <= 105
  • s and t 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;
    }
    
    

All Problems

All Solutions