给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
第一行由字符 "qwertyuiop" 组成。
第二行由字符 "asdfghjkl" 组成。
第三行由字符 "zxcvbnm" 组成。示例 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();
}
}
}
}