【每日刷题】字符的最短距离

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sd4567855/article/details/86632317

day26, 字符的最短距离

题目来源:leetcode
给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。

示例 1:
输入: S = “loveleetcode”, C = ‘e’
输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]

解答:首先确定 指定字符 的个数。 如果只有一个指定字符,直接遍历求举例即可。
如果有多个指定字符,首先处理第一个之前和最后一个指定字符之后的距离,这里的距离为下标相减。
之后处理 第一个 和最后一个之间的指定字符距离,这里分两次遍历,第一次遍历的距离为 元素与左侧的指定字符的距离,第二次遍历为 元素其右侧指定字符的距离。二者取较小值即可。

代码:

vector<int> shortestToChar(string S, char C) {
        vector<int> record;
        vector<int> result( S.size());
        
        for( int i = 0; i < S.size(); i++)
            if( S[i] == C)
                record.push_back( i);
        
        //只有一个指定字符的情况
        if( record.size() == 1){
            for( int i = 0; i < S.size(); i++)
                result[i] = abs( record[0] - i);        
            return result;
        }
        
        //有多个指定字符的情况
        //首先处理到第一个字符
        for( int i = 0; i <= record[0]; i++)
            result[i] = abs( record[0] - i);
        
        //处理最后一个字符
        for( int i = record[ record.size() - 1]; i < S.size(); i++)
            result[i] = abs( record[ record.size() - 1] - i);
            
        //对于其他情况
        
        //从左侧开始
        int k = 0;
        for( int i = record[0] + 1; i < record[ record.size() - 1]; i++){
            result[i] = ( abs( record[k] - i));
            if( i == record[k + 1])
                k++;
        }
        
        //从右侧更新
        k = 1;
        for( int i = record[0] + 1; i < record[ record.size() - 1]; i++){
            result[i] = min( result[i],abs( record[k] - i));
            if( i == record[k])
                k++;
        }
            
        return result; 
    }

运行结果:image.png-17.5kB


我的微信公众号

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sd4567855/article/details/86632317