LeetCode 821

T.821 字符的最短距离

 

题目描述:

给你一个字符串 s 和一个字符 c ,且 c 是 s 中出现过的字符。

返回一个整数数组 answer ,其中 answer.length == s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。

两个下标 i 和 j 之间的 距离 为 abs(i - j) ,其中 abs 是绝对值函数

 

示例:

输入:s = "loveleetcode", c = "e"
输出:[3,2,1,0,1,0,0,1,2,2,1,0]
解释:字符 'e' 出现在下标 35611 处(下标从 0 开始计数)。
距下标 0 最近的 'e' 出现在下标 3 ,所以距离为 abs(0 - 3) = 3 。
距下标 1 最近的 'e' 出现在下标 3 ,所以距离为 abs(1 - 3) = 2 。
对于下标 4 ,出现在下标 3 和下标 5 处的 'e' 都离它最近,但距离是一样的 abs(4 - 3) == abs(4 - 5) = 1 。
距下标 8 最近的 'e' 出现在下标 6 ,所以距离为 abs(8 - 6) = 2

 

思路:

1.两次遍历 第一次算出都在右侧情况,第二次遍历取左侧右侧最小情况。

复制代码
class Solution {
public:
    vector<int> shortestToChar(string s, char c) {
        vector<int> ans(s.size());
        set<int> position;
        for(int i = 0, index = -s.size(); i < s.size(); i++) {
            if(s[i] == c) index = i;
            ans[i] = i - index;
        }
        for(int i = s.size() - 1, index = s.size() * 2; i >= 0; i--) {
            if(s[i] == c) index = i;
            ans[i] = min(ans[i], index - i);
        }
        return ans;
    }
};
复制代码

 

2.双指针,分别记录下标和寻找目标字符位置。

复制代码
class Solution {
public:
    vector<int> shortestToChar(string s, char c) {
        vector<int> ans(s.size());
        int leftIndex = -1, rightIndex = 0;
        while(rightIndex < s.size() && s[rightIndex] != c) 
            rightIndex++;
        for(int i = 0; i < s.size(); i++) {
            if(i == rightIndex) {
                ans[i] = 0;
                leftIndex = i;
                rightIndex++;
                while(rightIndex < s.size() && s[rightIndex] != c) 
                    rightIndex++;        
            }
            else {
                if(leftIndex < 0) ans[i] = rightIndex - i;
                else if(rightIndex >= s.size()) ans[i] = i - leftIndex;
                else ans[i] = min(i - leftIndex, rightIndex - i);
            }
        }
        return ans;
    }
};
复制代码

 

 

 

 
posted @   HM-7  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示