StackTc 2018-06-26 02:19 采纳率: 90.9%
浏览 633
已结题

leetcode解答求优化,算法大神有吗

题目

图片说明

代码如下

class Solution {
    public boolean isIsomorphic(String s, String t) {
        Map<String,Integer> sMap = new HashMap<>();
        Map<String,Integer> tMap = new HashMap<>();

        for (int i = 0; i < s.length(); i++) {
            String sString = s.substring(i,i + 1);
            String tString = t.substring(i,i + 1);
            if (sMap.get(sString) ==null && tMap.get(tString) == null) {
                sMap.put(sString,i);
                tMap.put(tString,i);
                continue;
            }
            if((sMap.get(sString) ==null && tMap.get(tString) != null) || (sMap.get(sString) != null && tMap.get(tString) == null)) {
                return false;
            }
            if (!sMap.put(sString,i).equals(tMap.put(tString,i))) {
                return false;
            }
        }

        return true;
    }
}

  • 写回答

5条回答 默认 最新

  • oyljerry 2018-06-26 04:45
    关注

    直接一个map,如果key存在就查找和当前的比较,不存在就插入map

    评论
  • threenewbee 2018-06-26 07:43
    关注

    因为字母只有26个,用一个数组就可以,不用map
    我手上没有java,用C#写一个给你,思路一样,你自己修改成java的

     using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Q693096
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] ss = { "egg", "foo", "paper" };
                string[] ts = { "add", "bar", "title" };
                for (int i = 0; i < ss.Length; i++)
                {
                    Console.WriteLine("s={0}, t={1}, result={2}", ss[i], ts[i], isIsomorphic(ss[i], ts[i]));
                }
            }
    
            static public bool isIsomorphic(string s, string t)
            {
                s = s.ToLower();
                t = t.ToLower(); //如果可以假设s t都是小写,这两行可以删除
                char[] arr = new char[26];
                for (int i = 0; i < 26; i++) arr[i] = '#';
                for (int i = 0; i < s.Length; i++)
                {
                    if (arr[s[i] - 'a'] != '#')
                    {
                        if (arr[s[i] - 'a'] != t[i])
                            return false;
                    }
                    else
                    {
                        for (int j = 0; j < 26; j++)
                            if (arr[j] == t[i])
                                return false;
                        arr[s[i] - 'a'] = t[i];
                    }
                }
                return true;
            }
        }
    }
    
    

    展开全部

    评论
  • threenewbee 2018-06-26 07:47
    关注

    s=egg, t=add, result=True
    s=foo, t=bar, result=False
    s=paper, t=title, result=True
    Press any key to continue . . .

    需要注意一个问题,我不是很理解题目
    比如
    egg->aaa
    这个应该返回true还是false,题目不是很明确。
    因为所有的e和所有的g都替换成a的话,可以从egg得到aaa,但是反过来不行。
    如果这个是true,那么注释
    //for (int j = 0; j < 26; j++)
    // if (arr[j] == t[i])
    // return false;
    否则保留。

    评论
  • govdoo 2018-06-26 21:08
    关注
    应该是判断两个字符串的结构是否相同吧。 我这样写应该是简化了很多
    
    public static boolean isIsomorphic(String s, String t) {
                    boolean flag = false;
                    if(s.length() == t.length()){
                                char[] sArray = s.toCharArray();
                                char[] tArray = t.toCharArray();                                
                                for(int j=0;j<sArray.length;j++){
                                            int sCount = s.replaceAll("[^"+sArray[j]+"]", "").length(); 
                                            int tCount = t.replaceAll("[^"+tArray[j]+"]", "").length(); 
                                            if(sCount == tCount){ 
                                                    if(sCount>=2)flag = true;
                                            }else{
                                                    flag = false;
                                                    break;
                                            }
                                }
                    }
                    return flag;
    }
    
    评论
  • Debug_dodge 2018-06-29 23:35
    关注

    这个问题很简单的啊,开个26的数组,分别扫描两个字符串中每个字母的出现次数,然后再扫一遍这个数组,统计数组中每个元素的出现频率是否是一样的。

    举个例子:

    egg e出现1次,g出现2次,其他字母出现0次。因此出现0次的字母有24个,出现1次的有1个,出现2次的有1个。
    add a出现1次,d出现2次,其他字母出现0次。因此出现0次的字母有24个,出现1次的有1个,出现2次的有1个。
    所以这两个字符串能够转换。

    bar 出现0次的字母有23个,出现1次的有3个。
    foo 出现0次的字母有24个,出现1次的有1个,出现两次的有1个。
    所以这两个不能转换。

    评论
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 有关汽车的MC9S12XS128单片机实验
  • ¥15 求c语言动态链表相关课程有偿,或能将这块知识点讲明白
  • ¥15 FLKT界面刷新异常
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥50 单细胞测序拟时序分析
  • ¥50 运行springboot项目报错
  • ¥15 FTP 站点对站点传输失败
  • ¥15 宝塔面板一键迁移使用不了
  • ¥15 求一个按键录像存储到内存卡的ESP32CAM代码
  • ¥15 如何单独修改下列canvas推箱子代码target参数?,插入图片代替其形状,就是哪个绿色的圆圈每关用插入的图片替代
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部