除标点符号外,反转字符串中的单词

时间:2017-07-13 11:57:52

标签: c# algorithm

给定一个字符串“hello there,compiler。”,除标点符号外,如何反转每个单词。因此,在完成后将打印出来:“olleh ereht,relipmoc。”而不是“olleh,ereht .relipmoc”

我的代码(忽略标点符号):

 static string ReverseString(string s)
        {
            StringBuilder sb = new StringBuilder();
            string[] words = s.Split(' ');

            foreach (var word in words)
            {
                for (int i = word.Length - 1; i >= 0; i--)
                {
                    sb.Append(word[i]);
                }
                sb.Append(" ");
            }

            return sb.ToString();
        }

2 个答案:

答案 0 :(得分:7)

我建议Split(技巧:不仅仅在空格上,而是在非单词符号上 - 空格,逗号,点等),修改和最终Concat

  using using System.Text.RegularExpressions;

  ...

  string source = @"hello there, compiler.";

  string result = string.Concat(Regex
    .Split(source, @"(\W+)") // split on not word letter, separator preserved
    .Select(letter => letter.Length > 0 && char.IsLetter(letter[0]) 
       ? string.Concat(letter.Reverse()) // reverse letter
       : letter));                       // keep separator intact 

  Console.Write(result);

结果:

  olleh ereht, relipmoc.

答案 1 :(得分:1)

这是一个基于您原来的解决方案。只需检查反向词中的第一个字符是否为标点符号,如果保留它直到该词被反转,则将其添加回去。不是最优雅的解决方案,但它可以工作

static string ReverseString(string s)
    {
        var sb = new StringBuilder();
        var words = s.Split(' ');

        foreach (var word in words)
        {
            var toAdd = new char();
            for (var i = word.Length -1; i >= 0; i--)
            {
                if (char.IsPunctuation(word[i]))
                {
                    toAdd = word[i];
                }
                else
                {
                    sb.Append(word[i]);
                }
            }
            if (toAdd != new char())
            {
                sb.Append(toAdd);
            }

            sb.Append(" ");
        }

        return sb.ToString();
    }

编辑: 以上代码的一个稍微紧凑的版本:

static string ReverseString(string s)
    {
        var sb = new StringBuilder();

        foreach (var s1 in s.Split(' '))
        {
            var rev = s1.Reverse().ToList();
            char punct;
            if (char.IsPunctuation(punct = rev.First()))
            {
                rev.RemoveAt(0);
                rev.Add(punct);
            }
            rev.Add(' ');
            sb.Append(rev.ToArray());
        }
        return sb.ToString();
    }