每日一题 - 算法 - 004 - 仅执行一次字符串交换能否使两个字符串相等
每日一题系列
文章目录
仅执行一次字符串交换能否使两个字符串相等
🏃 给你长度相等的两个字符串 s1 和 s2 。
🏃 一次字符串交换操作的步骤如下:
🏃 选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符
💘 例如:
🏃 输入:s1 = “apple”, s2 = “appel”
🏃 输出:true
🏃 解释:例如,交换 s2 中的最后两个字符可以得到 “apple”
思路一:双指针列举所有情况
🏃 依次遍历s1与s2,使其任意两个位置交换
🏃 比较交换后的字符串是否相等即可
代码一:双指针列举所有情况
//交换两个字符void Swap(char* s1, char* s2){ char tmp = *s1; *s1 = *s2; *s2 = tmp;}bool IfEqual(char* s1, char* s2){ int len = strlen(s1); int i = 0, j = 0; //双指针列举所有情况 for (i = 0; i < len; i++) { for (j = 0; j < len; j++) { //列出所有情况,并交换字符作比较 Swap(&s1[i], &s1[j]); if (strcmp(s1, s2) == 0) return true; Swap(&s1[i], &s1[j]);//比较若不相等,交换回初始状态 } } return false;}int main(){char s1[]="apple";char s2[]="appel";return 0;}
🏃 但是这种方法属于暴力求解,时间开销为0(n)
思路二:单循环遍历字符串
🏃 从头到尾遍历两个字符串
🏃 用一个 differentPoint 数组记录比较过程中字符不相同的位置
🏃 用 ret 记录不相同的个数
🏃 如果 ret 大于2,说明不相同的个数很多,一次交换一定不能匹配,返回 false
🏃 如果 ret 等于1,说明不相等的只有一个,也是无法交换后匹配,返回 false
🏃 如果 ret 为2,则交换对应两个不同的字符
🏃 如果相等,则返回 true ,否则返回 false
单循环遍历字符串
void Swap(char* s1, char* s2){ char tmp = *s1; *s1 = *s2; *s2 = tmp;}bool areAlmostEqual(char * s1, char * s2){ int difpoints[3]={0};//记录不相等的位置 int tmp = 0;//记录不相等的个数 int len = strlen(s1); int i =0; for(i=0;i<len;i++) { //如果对应的两个字符不相等 if(s1[i]!=s2[i]) { //记录不相等的位置 difpoints[tmp]=i; //计数器+1 tmp++; //判断不相等的个数是否超过2 if(tmp>2) return false; } } //循环结束说明 tmp 的值为 0 1 2 三种情况 if(tmp==0) //说明全部匹配成功 两个字符串相等 { return true;}if(tmp==1) return fanle;//到这里只有tmp=2这种情况 Swap(&s1[difpoints[0]],&s1[difpoints[1]]); return strcmp(s1,s2)==0;}int main(){char s1[]="apple";char s2[]="appel";return 0;}
// 后记
🏃以后每天更新一道算法题,并且附带超级详细的讲解和注释,所有代码均可复制到编译器里自测。
🏃如果有疑问的小伙伴,欢迎评论留言,我会详细解答。
// 文章中任何错误都请大佬指正。