c# - 重新排列 string 的字符,使任意两个相邻的字符不相同

如何重新排列 string 的字符,使任何两个相邻的字符不相同?使用 c# c# 没有使用 Hashmaps 和 Dictionary 我设法找到 string 的每个元素,以及每个元素的出现。 https://onlinegdb.com/zfnUVjOp6是我到目前为止所做的

回答1

使用 LINQ,您可以收集 string 的字符,按重复字符对它们进行分组,然后旋转这些组并加入然后返回到 string

首先,一些使 Join 更容易的扩展方法:

public static class IEnumerableExt {
    public static string Join(this IEnumerable<char> chars) => String.Concat(chars); // faster >= .Net Core 2.1
    public static string Join(this IEnumerable<string> strings) => String.Concat(strings);
}

然后,一个扩展 IEnumerable<IEnumerable<T>> 的扩展方法:

public static class IEnumerableIEnumerableExt {
    public static IEnumerable<IEnumerable<T>> Pivot<T>(this IEnumerable<IEnumerable<T>> src) {
        var enums = src.Select(ie => ie.GetEnumerator()).ToList();
        var hasMores = Enumerable.Range(0, enums.Count).Select(n => true).ToList();

        for (; ; ) {
            var oneGroup = new List<T>();
            var hasMore = false;
            for (int j1 = 0; j1 < enums.Count; ++j1) {
                if (hasMores[j1]) {
                    hasMores[j1] = enums[j1].MoveNext();
                    hasMore = hasMore || hasMores[j1];
                    if (hasMores[j1])
                        oneGroup.Add(enums[j1].Current);
                }
            }

            if (!hasMore)
                break;

            yield return oneGroup;
        }

        for (int j1 = 0; j1 < enums.Count; ++j1)
            enums[j1].Dispose();
    }
}

最后,使用这些来解决您的问题:

var s = "How to rearrange the characters of a string";

var tryAns = s.OrderBy(c => c)
              .GroupBy(ch => ch)
              .Pivot()
              .Select(gch => gch.Join())
              .Join();

var dupRE = new Regex(@"(.)\1", RegexOptions.Compiled);
var hasDups = dupRE.IsMatch(tryAns);

// tryAns will be " Hacefghinorstw aceghnorst aeort aert ar r "
// hasDups will be false

如果生成的 string 有两个相邻的相同字符,则 hasDups 将为真。

相似文章

最新文章