在字符串中彼此相邻交换字母

Posted

技术标签:

【中文标题】在字符串中彼此相邻交换字母【英文标题】:swapping letters next to each other in a string 【发布时间】:2016-03-13 12:53:09 【问题描述】:

昨天我做了一个代码来交换字符串中彼此相邻的字母。举个例子:

输入=“拉拉拉”,输出=“拉拉拉”。或输入“bark”,输出=“arkb”。 “b”在“a”旁边,我们交换。现在“b”在“r”旁边,我们再次交换。等等……

今天我再次尝试这样做,但没有循环并且在“void(char * x)”函数中。 我真的搞砸了,我试图弄清楚如何在函数中表达替换。我知道它是这样的: 温度=str1; str1=str2; str2=温度;

在当前代码中我只能反转字符串,但我不知道如何使用“temp[1]”参数...一些解释会很有帮助! :)

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>

using namespace std;

void swapper(char* str)
char temp[1];
if(*str)
 swapper(str+1);
 cout << *str;

 

 int main ()

 char str[6] = "angel";
 cin >> str;
 char temp[1];
 swapper(str);
  

【问题讨论】:

我有点不确定你的“交换”……你不是把第一个字符移到最后吗? 你确定递归的swapper()调用吗? 我也不确定,但我对 c++ 真的很陌生,我只习惯于使用 int 函数或字符串函数“返回值”.. 有没有可能我在这个函数中调用另一个函数,然后使用我上面使用的递归来表达“交换”? 你想达到什么目标?循环似乎是正确的方法。如果您想做一个全递归交换器,您可能必须将输入限制为长度为 2 的幂的字符串。然后你可以递归地交换字符串的每一半,直到你得到单个字符。 你没有交换任何东西,你只是在打印字符。任何地方也没有名为“temp”的参数。 【参考方案1】:

我了解到您想编写一个方法,该方法采用 C 风格的字符串并将第一个字符移动到最后一个位置,即“abcde”->“bcdea”。循环是这里最简单的方法,但是如果要使用递归,则需要编写

#include <iostream>
using namespace std;

void swapper(char* ptr)

    if(*(ptr + 1)) //if ptr points to the last character, the next one is '\0' and the recurrence should end
    
        //swap currant character with the next
        char temp = *ptr;
        *ptr = *(ptr + 1);
        *(ptr + 1) = temp;
        //alternatively, you can use ptr[0] and ptr[1] instead of *ptr and *(ptr + 1), it's exactly the same thing

        //call swapper on the remainder of the string
        swapper(ptr + 1);
    


int main ()

    char str[6] = "angel";
    swapper(str);
    cout << str;

【讨论】:

//用下一个字符交换醋栗字符 temp = *ptr; *ptr = *(ptr + 1); *(ptr + 1) = 温度;当我使用“for循环”时,我做了同样的事情,但我没有使用任何指针。我认为“指针和引用”对我来说仍然很难理解,在转向递归之前我必须更多地练习它们。非常感谢您的帮助和良好的解释!! :)

以上是关于在字符串中彼此相邻交换字母的主要内容,如果未能解决你的问题,请参考以下文章

用于否定字符类的 C# 正则表达式,除非字符彼此相邻

字谜字符串编辑距离算法/代码?

bzoj2789[Poi2012]Letters*

CF1430E贪心树状数组

777. 在LR字符串中交换相邻字符 : 双指针运用题

Python regex如何在字母和数字之间插入连字符;并删除两个字母之间的连字符