Valid Anagram&Group Anagrams

本文介绍两种判断字符串是否为字母异位词的方法,并提供了一种分组字母异位词的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值