leetcode784

Posted AsenYang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode784相关的知识,希望对你有一定的参考价值。

这道题经过独立思考,通过使用二进制编码的方式来进行处理。分几个步骤一层一层的处理,最终解决了,这道题感觉应该属于medimu级别。

public class Solution
    {
        /// <summary>
        /// 列出二进制表示
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public IList<string> GetBinaryPartten(int count)
        {
            var list = new List<string>();
            //int count = 5;//字母数量
            int N = (int)Math.Pow(2, count) - 1;//最大值

            for (int i = 0; i <= N; i++)
            {
                Stack<int> St = new Stack<int>();
                int x = i;//1010
                while (x != 0)
                {
                    int y = x & 1;
                    St.Push(y);
                    x >>= 1;
                }

                int len = St.Count;//len<=count
                string result = "";
                for (int j = 0; j < count - len; j++)
                {
                    result += "0";
                }

                while (St.Any())
                {
                    int y = St.Pop();
                    result += y.ToString();
                }

                list.Add(result);
            }
            return list;
        }

        public IList<string> LetterCasePermutation(string S)
        {
            S = S.ToLower();
            var dic = new List<KeyValuePair<int, string>>();
            var list = new List<string>();
            var numdic = new HashSet<char> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            int count = 0;
            for (int i = 0; i < S.Length; i++)
            {
                if (numdic.Any(x => x == S[i]))//是数字
                {
                    continue;
                }
                else//是字母
                {
                    count++;//记录字母的数量
                    dic.Add(new KeyValuePair<int, string>(i, S[i].ToString()));//记录字母的下标和字母
                }
            }
            var list0 = GetBinaryPartten(count);
            foreach (var l0 in list0)
            {
                string temp = S;//原格式
                string map = l0;//当前格式编码
                //解析编码
                for (int i = 0; i < map.Length; i++)
                {
                    //按位解析,i表示dic[i]
                    var code = map[i];//code表示编码

                    var d = dic[i];//根据当前位的编码,解析出字符
                    var position = d.Key;//原串中的下标
                    var chars = d.Value;//当前字符

                    if (code == 0)
                    {
                        chars = chars.ToLower();
                    }
                    else
                    {
                        chars = chars.ToUpper();
                    }
                    //对当前位进行处理
                    string prefix = temp.Substring(0, position);
                    //string mid = temp.Substring(position, 1);
                    string mid = chars;//替换此位字符形式
                    string next = temp.Substring(position + 1);
                    temp = prefix + mid + next;
                }
                //这里将此格式的字符串加入list中
                list.Add(temp);
            }
            return list;
        }
    }

 

以上是关于leetcode784的主要内容,如果未能解决你的问题,请参考以下文章

leetcode784

leetcode784 字母大小写全排列

LeetCode 784. Letter Case Permutation (字母大小写全排列 )

python-leetcode784-子集字母大小写全排列

leetcode_1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold_[二维前缀和](代码片段

Leetcode.1024 视频拼接