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' 出现在下标 3、5、6 和 11 处(下标从 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; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构