> 文档中心 > 每日一题 - 算法 - 004 - 仅执行一次字符串交换能否使两个字符串相等

每日一题 - 算法 - 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;}

// 后记

🏃以后每天更新一道算法题,并且附带超级详细的讲解和注释,所有代码均可复制到编译器里自测。
🏃如果有疑问的小伙伴,欢迎评论留言,我会详细解答。

// 文章中任何错误都请大佬指正。