leetcode每日一题 821. 字符的最短距离
1.普通双指针
class Solution {
public int[] shortestToChar(String s, char c) {
int[] result = new int[s.length()];
int l = 0;
int r = 0;
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == c){
result[i] = 0;
continue;
}
l = r = i;
while (l >= 0 || r < s.length()) {
if (l >= 0 && s.charAt(l) == c) {
result[i] = i - l;
break;
}
if (r < s.length() && s.charAt(r) == c) {
result[i] = r - i;
break;
}
r++;
l--;
}
}
return result;
}
}
2.加点缓存,比如可以根据上一个元素的结果来计算这个元素的结果
class Solution {
public int[] shortestToChar(String s, char c) {
//-1 左边 0当前元素 1右边
int[][] db = new int[s.length()][2];
//初始化第一个元素数据
db[0][0] = s.indexOf("" + c);
db[0][1] = db[0][0] > 0 ? 1 : 0;
//循环遍历后续元素
for (int i = 1; i < db.length; i++) {
//获取字符
char c1 = s.charAt(i);
//如果是要找的字符,直接置为0
if (c1 == c) {
db[i][0] = 0;
db[i][1] = 0;
continue;
}
//如果上一个元素说离他最近的元素在他右边
if (db[i - 1][1] == 1) {
db[i][0] = db[i - 1][0] - 1;
db[i][1] = 1;
continue;
}
//如果上一个元素说离他最近的元素就是他
if (db[i - 1][1] == 0) {
db[i][0] = 1;
db[i][1] = -1;
continue;
}
boolean b = false;
//最后一种可能 上一个元素说离他最近的在他左边
for (int j = i + 1; j < Math.min(s.length(), i + db[i - 1][0] + 1); j++) {
if(s.charAt(j) == c){
db[i][0] = j-i;
db[i][1] = 1;
b = true;
break;
}
}
if(!b){
db[i][0] = db[i-1][0]+1;
db[i][1] = -1;
}
}
int[] ints = new int[s.length()];
for (int i = 0; i < ints.length; i++) {
ints[i] = db[i][0];
}
return ints;
}
}
分类:
leetcode 每日一题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构