LeetCode500. 键盘行

给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。

美式键盘 中:

第一行由字符 "qwertyuiop" 组成。
第二行由字符 "asdfghjkl" 组成。
第三行由字符 "zxcvbnm" 组成。

American keyboard

示例 1:

输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]
示例 2:

输入:words = ["omk"]
输出:[]
示例 3:

输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]
 

提示:

1 <= words.length <= 20
1 <= words[i].length <= 100
words[i] 由英文字母(小写和大写字母)组成

来源:力扣(LeetCode)
链接:力扣
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一:暴力法 

特点:容易想到,容易编码,效率感人T.T

相关代码:C#字符串去除串内重复字符

public class Solution
{
    public string[] FindWords(string[] words) 
    {
        return HleetCode.N500KeyboardRow.Commit(words);
    }
    public partial class HleetCode
    {
        //500. 键盘行题解
        public static class N500KeyboardRow
        {
            public static string[] Commit(string[] words)
            {
                List<string> res = new List<string>();
                string[] keyboardLines = { "qwertyuiop", "asdfghjkl", "zxcvbnm" };
                //遍历输入的字符串数组
                foreach (var wd in words)
                {
                    //字符转为小写,再去重,目的是减少对比次数
                    string word = StringEliminateDuplicate(wd.ToLower());
                    for (int i = 0; i < keyboardLines.Length; i++)
                    {
                        bool isRes = true;
                        bool isNotRes = false;
                        //遍历单词中的字符
                        for (int j=0;j< word.Length;j++)
                        {
                            if (!keyboardLines[i].Contains(word[j]))
                            {
                                isRes = false;
                                if(j>0) isNotRes=true;//遍历到第2个以上的字符发现不满足条件,可以确定不是想要的结果
                                break;
                            }
                        }
                        if(isNotRes) break;//不是想要的结果,直接换下一个单词
                        if (isRes) res.Add(wd);                          
                    }
                }
                return res.ToArray();      
            }
                //字符串去除重复
            private static string StringEliminateDuplicate(string str)
            {
                var strArray = str.Distinct().ToArray();        //字符去重
                return string.Join(string.Empty, strArray);     //字符成串
            }
        }
    }
}

官方暴力版:

特点:

  • 将a~z重新编码为对应的行,减少一层循环(不过貌似效率差不多T.T)
public class Solution
{
    public string[] FindWords(string[] words) 
    {
        return HleetCode.N500KeyboardRow.Commit(words);
    }

    public partial class HleetCode
    {
        //500. 键盘行题解
        public static class N500KeyboardRow
        {
            public static string[] Commit(string[] words)
            {
               
                IList<string> list = new List<string>();
                string rowIdx = "12210111011122000010020202";//将a~z重新编码为对应的行
                foreach (string word in words) 
                {
                    bool isValid = true;
                    char idx = rowIdx[char.ToLower(word[0]) - 'a'];//存入第一个字符
                    for (int i = 1; i < word.Length; ++i) 
                    {
                        if (rowIdx[char.ToLower(word[i]) - 'a'] != idx) 
                        {
                            isValid = false;
                            break;
                        }
                    }

                    if (isValid) 
                    {
                        list.Add(word);
                    }
                }
           
                string[] ans = new string[list.Count];
                for (int i = 0; i < list.Count; ++i) 
                {
                    ans[i] = list[i];
                }
                return ans;
            }
        }
     
    }
}

方法二:键值对

特点:内存消耗少

public class Solution 
{

    public string[] FindWords(string[] words)
    {   
        return HleetCode.N500KeyboardRow.Commit(words);
    }

    public partial class HleetCode
    {
        public static class N500KeyboardRow
        {          
            public static string[] Commit(string[] words)
            {
                Dictionary<char,char>  dict= new Dictionary<char,char>();
                foreach(var i in "qwertyuiopQWERTYUIOP") dict.Add(i,'1');   
                foreach(var i in "asdfghjklASDFGHJKL") dict.Add(i,'2');
                foreach(var i in "zxcvbnmZXCVBNM") dict.Add(i,'3');
        
                var list=new List<string>();
                foreach(var word in words)
                {
                    int lineNumber = dict[word[0]];           
                    var match=true;
                    foreach(var c in word)
                    { 
                        if(dict[c]!=lineNumber) 
                        {
                            match=false;
                            break;
                        }
                    }
                
                    if(match) list.Add( word); 
                }
                return list.ToArray();
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值