LeetCode 2381. Shifting Letters II

46 阅读1分钟

🔗 leetcode.com/problems/sh…

题目

  • 给一个字符串 s,由 a-z 小写字母组成
  • 给一个组操作,由 st, end, dir 组成,表示 index 从 st-end,字母全部都进行一次 shift,dir 为 1,则都 +1,dir 为 0,则都 -1
  • z + 1 为 a,a - 1 为 z
  • 返回经过这一系列操作之后,字符串 s 的结果

思路

  • 先按照朴素的模拟,当前的数据规模会 TLE
  • 记录差分数组,利用 presum 可以在复杂度 On 的情况下,完成字母的 shift
  • 差分数组记录从某个 index 开始,字母需要 shift 的值
  • 对于 dir 为 1, arr[start]++, arr[end + 1] - -
  • 对于 dir 为 0,arr[start] - -, arr[end + 1] ++
  • 字母 shift 的变换为 s[i] = ‘a’ + ((s[i] - ‘a’ + ps) % 26 + 16)%26

代码

class Solution {
public:
    string tle1(string& s, vector<vector<int>>& shifts) {
        for (auto vec : shifts) {
            int st = vec[0];
            int end = vec[1];
            int dir = vec[2];
            if (dir) {
                for (int i = st; i <= end; i++) {
                    if (s[i] == 'z')
                        s[i] = 'a';
                    else
                        s[i] = s[i] + 1;
                }
            } else {
                for (int i = st; i <= end; i++) {
                    if (s[i] == 'a')
                        s[i] = 'z';
                    else
                        s[i] = s[i] - 1;
                }
            }
        }
        return s;
    }
    string tle2(string& s, vector<vector<int>>& shifts) {
        vector<int> ps(s.size());
        for (int i = 0; i < s.size(); i++) {
            for (auto vec : shifts) {
                int st = vec[0];
                int end = vec[1];
                int dir = vec[2];
                if (i < st | i > end)
                    continue;
                if (dir)
                    ps[i]++;
                else
                    ps[i]--;
            }
        }
        for (int i = 0; i < s.size(); i++) {
            s[i] = 'a' + ((s[i] - 'a'+ ps[i]) % 26 + 26) % 26;
        }
        return s;
    }

    string presum(string& s, vector<vector<int>>& shifts) {
         vector<int> arr(s.size() + 1);
        for (auto vec : shifts) {
            int st = vec[0];
            int end = vec[1];
            int dir = vec[2];
            if (dir) {
                arr[st]++;
                arr[end + 1]--;
            } else {
                arr[st]--;
                arr[end + 1]++;
            }
        }
        int ps = 0;
        for (int i = 0; i < s.size(); i++) {
            ps += arr[i];
            s[i] = 'a' + ((s[i] - 'a'+ ps) % 26 + 26) % 26;
        }
        return s;
    }
    string shiftingLetters(string s, vector<vector<int>>& shifts) {
        //return tle1(s, shifts);
        //return tle2(s, shifts);
        return presum(s, shifts);
        
    }
};