🔗 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
if (s[i] == 'z')
s[i] = 'a'
else
s[i] = s[i] + 1
}
} else {
for (int i = st
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
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
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
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)
}
}