Vaild Anagram
Title:Given two strings s and t, write a function to determine if t is an anagram of s.
For example,
s = “anagram”, t = “nagaram”, return true.
s = “rat”, t = “car”, return false.
- 首次,带大家了解一下什么是回文构词法(Anagram),即字符串总长度相等,且字符串中各个字符数目相同。
- 然后本人提供如下2种方法:
- (1)先排序后比较; (2)先计数后比较
(1)先排序后比较:
JS实现:
var isAnagram = function(s, t) {
if(s.length!==t.length)
{
return false;
}
if(s.length===1)
{
if(s!==t)
{
return false;
}
}
var s1=s.split("");//一个字符串分割成字符串数组
var s2=t.split("");
s1.sort();
s2.sort();
var ss=s1.join("");//将字符串数组连接成字符串
var tt=s2.join("");
if(ss!==tt)
{
return false;
}
return true;
}
运行时间为:130ms。
思路:1.stringObject.split(separator,howmany),用于把一个字符串分割成字符串数组。
2.arrayObject.sort(sortby),用于对数组的元素进行排序。sortby 可选。规定排序顺序。必须是函数。
3.arrayObject.join(separator),用于把数组中的所有元素放入一个字符串。separator 可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。
利用以上上个函数,将字符串分解成字符串数组后,排序,然后再组合成字符串;再比较S与T是否相public class Solution {
public boolean isAnagram(String s, String t) {
char[] sArr = s.toCharArray();
char[] tArr = t.toCharArray();
Arrays.sort(sArr);
Arrays.sort(tArr);
return String.valueOf(sArr).equals(String.valueOf(tArr));
}
} a代码:
(2)先计数后比较
var isAnagram = function(s, t) {
var total1={}; //用于存储s中的属性值
var total2={}; //用于存储t中的属性值
if(s.length!==t.length) //首先判断两个字符串的长度是否相等
{
return false;
}
for(var i=0,len=s.length;i<len;i++)
{
var val1=s.substr(i,1); //依次遍历s的值
var val2=t.substr(i,1);//依次遍历t的值
if(total1.hasOwnProperty(val1)) //检查S中是否含有val1属性,若有则加1,否则加入该属性
{
total1[val1]++;
}else{
total1[val1]=1;
}
if(total2.hasOwnProperty(val2)) //检查t中是否含有val2属性,若有则加1,否则加入该属性
{
total2[val2]++;
}else{
total2[val2]=1;
}
}
for(var key in total1) //判断两个字符串中对应的字符数是否相等
{
if(total1[key]!==total2[key])
{
return false;
}
}
return true;
};
运行时间:130ms
思路:利用total1,total2对象分别存储数组中字符数量,其中,key对应于数组中的字符,value为相应字符出现的次数;同时遍历数组,计算字符数量存入对象中;遍历完后比较total1,total2对象对应键值对是否相等。
Group Anagram
Given an array of strings, group anagrams together.
For example, given: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
Return:
[
[“ate”, “eat”,”tea”],
[“nat”,”tan”],
[“bat”]
]
JS代码:
var groupAnagrams = function(strs) {
if(strs.length===0)
{
return null;
}
var strsObj={};
var result=[];
if((strs.length===1))
{
result[0]=strs;
return result;
}
for(var i=0,len=strs.length;i<strs.length;i++) //遍历strs数组,并将数组中的字符串排序后依次存入strsObj对象中
{
var str=[],
str1="";
if(strs[i].length>0)
{
str=strs[i].split("");//将字符串转换为字符串数组
str.sort();//对字符串数组进行排序
str1=str.join("");//将排序后的字符串数组连接成字符串
}
if(strsObj.hasOwnProperty(str1))
{
strsObj[str1].push(i);
}else
{
strsObj[str1]=[];
strsObj[str1].push(i);
}
}
var index=0;
for(var key in strsObj)
{
result[index]=[];
for(var j=0,len1=strsObj[key].length;j<len1;j++)
{
var strsIndex=strsObj[key][j];
result[index].push(strs[strsIndex]);
}
index++;
}
return result;
};
思路:1、对每个数组中所包含的字符串进行排序,存储与对象数组(即对象中的值为数组:var obj={[],[],[]…})中,key对应于排序后的字符串,value为原数组中index。
2.遍历对象,将对象中对应的每个键的值取出,var strsIndex=strsObj[key][j];
result[index].push(strs[strsIndex]);