Leetcode5469. K 次操作转变字符串【第 32 场双周赛】

题目链接
题意:给定一小写字母字符串,第i次操作可把任一位字符切换i次,切换操作即把字符用字母表中下一个字符替换之,假设字母表成环,即 z z z的下一位是 a a a,当然也可以选择不切换,每一位至多只能进行一次操作。问能否在k次操作之内将字符串 s s s变为 t t t
思路:将每一位的切换最小值(即最早在第几次操作进行切换) i n d ind ind 处理出来,显然 1 ≤ i n d ≤ 25 1\le ind \le 25 1ind25,再对于每个 i n d ind ind,计算他们最晚是第几次操作可以完成,判断最晚操作 i n d i + ( n u m [ i n d i ] − 1 ) ∗ 26 ind_i+(num[ind_i]-1)*26 indi+(num[indi]1)26 k k k的关系,超过 k k k就不能完成。
AC代码:

class Solution {
public:
    bool canConvertString(string s, string t, int k) {
        int ls=s.size(),lt=t.size();
        if(ls!=lt) return false;
        vector<int> a(ls);
        map<int,int> ma;
        for(int i=0;i<ls;i++){
            if(s[i]!=t[i]){
                int ind=(t[i]-s[i]+26)%26;
                ma[ind]++;
            }
        }
        for(int i=1;i<26;i++){
            if(i+(ma[i]-1)*26>k) return false;
        }
        return true;
    }
};

写在最后:本题一开始的想法是对每一位字符都判断在第几次进行操作,弄一个while一直往后推,这样复杂度显然不对。该用简单公式换一下就换,不能总是在错误做法里浪费时间。

你可能感兴趣的:(Leetcode)