力扣日更859亲密字符串

haimian
2024-11-09 / 0 评论 / 5 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年11月09日,已超过161天没有更新,若内容或图片失效,请留言反馈。

依旧是正常的日更,今天来看一很好的题目
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。

交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。

例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。

这个不可以想的很简单,要卡很多的范围!!!
我先直接上代码把

#include <stdio.h>
#include <string.h>
int hash[26];
bool buddyStrings(char * s, char * goal){
    int len_s = strlen(s);
    int len_g = strlen(goal);
    int left = 0;
    int right = len_s - 1;

    if (len_g != len_s) {
        return false;
    }
    memset(hash, 0, sizeof(hash));

    if (strcmp(s, goal) == 0) {
        for (int i = 0; i < len_s; i++) {
            hash[s[i] - 'a']++;
            if (hash[s[i] - 'a'] >= 2) {
                return true;
            }
        }

        return false;
    }

    while (left < len_s && s[left] == goal[left]) {
        left++;
    }

    while (right >= 0 && s[right] == goal[right]) {
        right--;
    }

    char tmp = s[left];
    s[left] = s[right];
    s[right] = tmp;

    return strcmp(s, goal) == 0 ? true : false;
}

代码原理很简单,首先先定义俩长度 sizeof(s)sizeof(goal),用来作比较
接下来先简单比较,如果连大小都不一样的话 那么没必要后面的判断了。
接下来如果我们假设a是aa goal也是aa的话
那么先进行判断 strcmp是比较字符串是否相等的一个函数,用来比较俩值是否相等的
那么如果相等的话 让这个每一个值都存到hash里面,如果hash大于2的话 那么判断是true

接下来是不相等的情况 比如s是aab goal是aba的话
那么 进行循环判断,当第一次循环的时候发现 left是1的情况就停止了,第二次循环是当第一下就听着就停止了,此时的right是2
接下来 数组进行交换后判断俩字符串是否相等,相等出true 不相等出false

还有一种情况是 s是aab goal是aac的情况
那么直接进行循环判断,第一次循环的时候,left是2的时候停止,那么第二次循环也是2的时候停止 right是2的情况下
那么这种情况下字符串换顺序就没有任何的意义
当strcmp的时候,他就会自动返回false
return strcmp(s,goal) == 0?true : false;

m3ack5md.png

0

评论 (0)

取消