依旧是正常的日更,今天来看一很好的题目
给你两个字符串 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;
评论 (0)