Valid Anagram&Group Anagrams

来源:互联网 发布:网络运营工程师做什么 编辑:程序博客网 时间:2024/06/05 17:12

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]);

0 0