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;
    }
}

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

因为字母只有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;
        }
    }
}

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;
否则保留。

应该是判断两个字符串的结构是否相同吧。 我这样写应该是简化了很多

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;
}

这个问题很简单的啊,开个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个。
所以这两个不能转换。