【leetcode刷题】-- 821.字符的最短距离(C++暴力)

字符的最短距离


原题链接:

https://leetcode-cn.com/problems/shortest-distance-to-a-character/submissions/

题目:

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

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

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

示例 1:

输入: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 。
示例 2:

输入:s = “aaab”, c = “b”
输出:[3,2,1,0]

提示:
1 <= s.length <= 104
s[i] 和 c 均为小写英文字母
题目数据保证 c 在 s 中至少出现一次

C++暴力解法:

class Solution {
    
    
public:
    vector<int> shortestToChar(string s, char c) {
    
    
      
        vector<int> answer(s.length());		//先定义一个vector数组存储我们的 位置计算结果

        int idn = s.length();		//定义一个记录相同字符下标的变量
        for(int i = 0 ; i < s.length(); i++){
    
    		//先从左边循环
            if(s[i] == c){
    
    	//碰到相同的字符进入
                idn = i;	//记录相同字符的下标
            }		
            answer[i] = abs(i - idn);		//取相减的绝对值
        }

        int ind = 0;		//定义一个记录相同字符的下标
        for(int i = s.length() - 1 ;i >= 0; --i){
    
    		//从右边开始循环
            if(s[i] == c){
    
    	//同上
                ind = i;		//记录
            }
            answer[i] = min(answer[i] , abs(ind - i));		//比较原记录的数,哪个更小
        }
        return answer;		//返回
    }
};

思路:

题目是想要我们找出离最近的给定字符的距离差,并保存在数组中返回,我们就可以定义一个vector数组,用来存储结果。

定义idn和ind是用来记录遇到相同下标时的位置,然后利用它们去和每个位置进行相减,取绝对值。

定idn和ind初始值为0和length是方便后续的计算准确

最后min用来比较两次数据相减得到的值取最小的那个,然后返回

猜你喜欢

转载自blog.csdn.net/weixin_60154963/article/details/124275630