【牛客编程巅峰赛S1第5场】牛牛的字符串

牛牛的字符串

https://ac.nowcoder.com/acm/problem/207310

题目

有一个长度为 的由小写字母组成的字符串 ,还有一个整数
在每一步中,可以选择一个位置 并在 处交换字符()并且 ,即交换之后,新形成的字符串应字典序大于旧字符串。
求最多可以交换多少步。

解题思路

将字符串分成 组子串,每组子串由字符串 中下标 后相等的字符组成。
对于每个子串,遍历每个字符,计算子串中位于该字符前面,且小于当前字符的字符个数 ,将这些累加计入 ,返回答案。

下面的代码虽然使用了 3 个循环,但时间复杂度是
外面两个循环加起来明显是 ,因为遍历了字符串中的每个字符,且没有重复。
最内的循环为 ,而 ,所以为

C++代码

class Solution {
public:
    /**
     * 
     * @param s string字符串 s.size() <= 1e5
     * @param k int整型 k <= s.size()
     * @return int整型
     */
    int turn(string s, int k) {
        // write code here
        int ans = 0;
        int n = s.size();
        for(int i=0; i<k; ++i){
            int num[26] = {0};
            num[s[i]-'a'] = 1;
            for(int j=i+k; j<n; j+=k){
                int index = s[j] - 'a';
                for(int t=0; t<index; ++t){
                    ans += num[t];
                }
                ++num[index];
            }
        }
        return ans;
    }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
拉丁是我干掉的:把上海理工大学改成北京理工大学。成功率增加200%
点赞 评论 收藏
分享
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务