2399-匀整字符串

Posted by LemonWhale on April 24, 2023
给你一个下标从 0 开始的字符串 s ,该字符串仅由小写英文字母组成,s 中的每个字母都 恰好 出现 两次 。另给你一个下标从 0 开始、长度为 26 的的整数数组 distance 。
字母表中的每个字母按从 0 到 25 依次编号(即,'a' -> 0, 'b' -> 1, 'c' -> 2, ... , 'z' -> 25)。
在一个 匀整 字符串中,第 i 个字母的两次出现之间的字母数量是 distance[i] 。如果第 i 个字母没有在 s 中出现,那么 distance[i] 可以 忽略 。
如果 s 是一个 匀整 字符串,返回 true ;否则,返回 false 。

示例 1: 

输入:s = "abaccb", distance = [1,3,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
输出:true
解释:
- 'a' 在下标 0 和下标 2 处出现,所以满足 distance[0] = 1 。
- 'b' 在下标 1 和下标 5 处出现,所以满足 distance[1] = 3 。
- 'c' 在下标 3 和下标 4 处出现,所以满足 distance[2] = 0 。
注意 distance[3] = 5 ,但是由于 'd' 没有在 s 中出现,可以忽略。
因为 s 是一个匀整字符串,返回 true 。

核心思想在于记录下字母第一次出现时候的位置,当第二次出现的时候直接进行运算然后和distance中的值相对比,如果不同则直接返回FALSE。

Python写法

def checkDistances(s: str, distance: list[int]) -> bool:
    # 字符串长度
    n = len(s)

    # 字母第一次出现的位置
    firstIndex = [0] * 26

    for i in range(n):
        # 计算字母的位置
        idx = ord(s[i]) - 97
        # 如果第一次出现的位置和第二次出现的位置之差不等于distance的值则返回false
        # 加上firstIndex[idx]!=0的目的是保证他不是第一次出现
        if firstIndex[idx] and i - firstIndex[idx] != distance[idx]:
            return 0
        firstIndex[idx] = i + 1  # 方便计算
    return 1

s = "abaccb"
distance = [1, 3, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
print(checkDistances(s, distance))

C语言写法

  
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

bool checkDistances(char *s, int *distance) {
    int n = strlen(s);
    int firstIndex[26] = {0};
    for (int i = 0; i < 26; i++) {
        firstIndex[i] = 0;
    }

    int idx = 0;
  
    for (int i = 0; i < n; i++) {
        idx = s[i] - 'a';
        printf("%d\n", idx);
        if (firstIndex[idx] & (i - firstIndex[idx] != distance[idx])) {
            return false;
        }
        firstIndex[idx] = i + 1;
    }
    return true;
}

int main() {
    char s[] = "abaccb";
    int distance[] = {1, 3, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    printf("s是否为匀整字符串:%d", checkDistances(s, distance));
    return 0;
}