重新排列字符串,以便字母“x”后面跟不上字母“y”

时间:2014-05-21 23:39:44

标签: c algorithm

我有一个字符串,比如说自动或者是自动的。而且我想确保如果这封信是“你'遵循这封信' a'字符颠倒了。

Input: automatic
Output: uatomatic

Input: auter
Output: uater

Input: auauauauauauau
Output:uuuuuuuaaaaaaa

一次通过是否可以这样做?

编辑:我有一个C实现,但我不确定如何反转字符串,以便我的整行不会被反转,只是单词。

char* characterReverse(char* input) {
    char temp;

    int low = 0;
    int length = strlen( input );
    int high = length - 1;

    while ( low <= high )
    {
        temp = input[ low ];
        input[ low ] = input[ high ];
        input[ high ] = temp;

        low++;
        high--;
    }

return input;

}

2 个答案:

答案 0 :(得分:3)

这是一个适用于您的测试用例的C#实现(请注意它只适用于小写。如果您需要不区分大小写的版本,请告诉我):

    static void Main(string[] args)
    {
        string input1 = "automatic";
        string input2 = "auter";
        string input3 = "auauauauauauau";

        Console.WriteLine("Input: {0}{2}Output: {1}{2}", input1, ReverseAu(input1), Environment.NewLine);
        Console.WriteLine("Input: {0}{2}Output: {1}{2}", input2, ReverseAu(input2), Environment.NewLine);
        Console.WriteLine("Input: {0}{2}Output: {1}{2}", input3, ReverseAu(input3), Environment.NewLine);
    }

    private static string ReverseAu(string input)
    {
        char[] chars = input.ToCharArray();

        int ndx = input.IndexOf("au", StringComparison.Ordinal);

        while (ndx > -1)
        {
            chars[ndx] = 'u';
            chars[ndx + 1] = 'a';
            input = new string(chars);
            chars = input.ToCharArray();
            ndx = input.IndexOf("au", StringComparison.Ordinal);
        }

        return input;
    }

答案 1 :(得分:3)

我不确定一次传球和传球(这有点困难/不可能,因为你不知道在没有向前看的位置放置什么角色),但是这里&# 39;是下一个最好的东西 - O(n)就地算法:(在Java中)

char[] characterReverse(char[] arr, char x, char y)
{
   int xCount = 0, yCount = 0, lastPos = 0;
   for (int i = 0; i < arr.length; i++)
   {
      if (arr[i] == x)
         xCount++;
      else if (arr[i] == y && xCount > 0)
         yCount++;
      else
      {
         for (; yCount > 0; yCount--)
            arr[lastPos++] = y;
         for (; xCount > 0; xCount--)
            arr[lastPos++] = x;
         lastPos = i+1;
      }
   }
   for (; yCount > 0; yCount--)
      arr[lastPos++] = y;
   for (; xCount > 0; xCount--)
      arr[lastPos++] = x;
   return arr;
}

我们的基本想法是,只要我们看到x,就会跟踪xy字符的数量,直到我们得到其他内容,然后开始投放y&#39;然后x从我们看到第一个x的位置返回。

Online demo