力扣2381. 字母移位 II
这一题的意思是给出一个字符串,现在给出一系列操作,每一个操作是对字符串的区间的每一个字符进行一个前移或后移操作,最后返回所有操作后的最终字符串。
对区间进行操作,很明显可以用差分来表示区间变化,我们可以对差分数组求前缀和从而得到每一个位置最终的变化,如果最终这个位置的》0,那么说明它是后移,如果它是《0那么表示前移
特别需要注意的是,可能它的移动值会超过数组的大小,因此我们需要对变化值进行一个取模,保证它处在0-25之间。
完整代码如下:
class Solution {
public:vector<char> front;vector<char> last;string shiftingLetters(string s, vector<vector<int>>& shifts) {int n=s.size();vector<int> d(n+1,0);vector<int> dsum(n+1,0);for(int i=0;i<shifts.size();i++){int l=shifts[i][0];int r=shifts[i][1];int x=shifts[i][2];if(x==0){d[l]-=1;d[r+1]+=1;}else{d[l]+=1;d[r+1]-=1;}}for(int i=0;i<n+1;i++){if(i==0){dsum[i]=d[i];}else{dsum[i]=dsum[i-1]+d[i];}}for(int i=0;i<s.size();i++){int xx=((s[i]-'a')+dsum[i]) % 26;if(xx<0) xx += 26; // 保证非负s[i]='a'+xx;}return s;}
};
时间复杂度O(n)
总结:这一题很明显用差分,但我在边界值上花费了大量的时间,因为它可能会超过数组的大小,因此我们要%26,同时要保证非负+26.