[leetcode]205. Isomorphic Strings 同构字符串
Given two strings s and t, determine if they are isomorphic.
Two strings are isomorphic if the characters in s can be replaced to get t.
All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.
Example 1:
Input: s ="egg",
t ="add"
Output: true
Example 2:
Input: s ="foo",
t ="bar"
Output: false
Example 3:
Input: s ="paper",
t ="title"
Output: true
Note:
You may assume both s and t have the same length.
思路1(用两个map)
1. scan char a from S and char b from T in the same time
2. use two int array to mimic hash table: mapAB, mapBA
3. if mapAB[a] == 0 , means I didn't mapping it, assign current b to mapAB[a]
otherwise, means I did mapping it, check b == mapAB[a] ?
4. do the same operation for mapBA
5. why checking two maps at the same time? Coz S: egg -> T: aaa return true
then we still check T: aaa -> S: egg
代码
class Solution {
public boolean isIsomorphic(String s, String t) {
if(s.length()!=t.length()) return false;
// uses the arrays to mimic two hash table
int [] mapAB = new int[256];//ASCII characters
int [] mapBA = new int[256];
for(int i = 0; i< s.length();i++){
char a = s.charAt(i);
char b = t.charAt(i);
// mapAB[a]!=0 means I already mapping it
if(mapAB[a]!=0){
if(mapAB[a]!=b) return false;
}
// mapAB[a]==0 means I haven't mapping it
else{
mapAB[a]= b;
} // why checking two map? coz S:egg T: aaa would return true if only checking mapAB
if(mapBA[b]!=0){
if(mapBA[b]!=a) return false;
}else{
mapBA[b] = a;
}
}
return true;
}
}
思路2(只用一个map)
1. scan either S or T(assuming they have same length)
2. store the idx of current char in both strings.
if previously stored idx are different from current idx, return false
举例:
S: egg T: aaa
m[e] = 1 m[a+256] = 1
m[g] = 2 occurs that previous m[a+256] = 1 return false
代码
class Solution {
public boolean isIsomorphic(String s, String t) {
if(s.length() != t.length()) return false;
int[] m = new int[512];
for (int i = 0; i < s.length(); i++) {
if (m[s.charAt(i)] != m[t.charAt(i)+256]) return false;
m[s.charAt(i)] = m[t.charAt(i)+256] = i+1;
}
return true;
}
} /* Why not m[s.charAt(i)] = m[t.charAt(i)+256] = i ?
coz 0 is the default value, we should not use it. otherwise we cannot distinguish between
the default maker and the the marker we made.
S: aa T: ab
i= 0: m[a] = 0 m[a+256] = 0
but m[b+256] is defaulted 0 */
followup1:
如果输入K个string,判断其中至少两个是Isomorphic Strings, 返回boolean
思路
1. 将所有的given string都转成同一种pattern
ex. foo -> abb
ex. gjk -> abc
ex. pkk -> abb
2. 用一个hashmap来存 transfered word 和其出现的频率。
key : value(frequency)
ex. foo -> abb : 1
ex. gjk -> abc : 1
ex. pkk -> abb : 1+1 return true
代码
public boolean findIsomorphic(String[] input) {
// key: transWord, value: its corresponding frequency
Map<String, Integer> map = new HashMap<>();
for (String s : input) {
// transfer each String into same pattern
String transWord = transfer(s);
if (!map.containsKey(transWord)) {
map.put(transWord, 1);
}
// such transWord pattern already in String[]
else {
return true;
}
}
return false;
} /* pattern: every word start with 'a'
when comes a new letter, map it to cur char,
and increase the value of cur cha
*/
private String transfer(String word) {
Map<Character, Character> map = new HashMap<>();
StringBuilder sb = new StringBuilder();
char cur = 'a';
for (char letter : word.toCharArray()) {
if (!map.containsKey(letter)) {
map.put(letter, cur);
cur++;
}
sb.append(map.get(letter));
}
return sb.toString();
}
followup2:
如果输入K个string, 判断其中任意两两是Isomorphic Strings,返回boolean
即给定K个string都能化成同一种等值的pattern
[leetcode]205. Isomorphic Strings 同构字符串的更多相关文章
- [leetcode]205. Isomorphic Strings同构字符串
哈希表可以用ASCII码数组来实现,可以更快 public boolean isIsomorphic(String s, String t) { /* 思路是记录下每个字符出现的位置,当有重复时,检查 ...
- 205 Isomorphic Strings 同构字符串
给定两个字符串 s 和 t,判断它们是否是同构的.如果 s 中的字符可以被替换最终变成 t ,则两个字符串是同构的.所有出现的字符都必须用另一个字符替换,同时保留字符的顺序.两个字符不能映射到同一个字 ...
- [LeetCode] Isomorphic Strings 同构字符串
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...
- LeetCode 205 Isomorphic Strings(同构的字符串)(string、vector、map)(*)
翻译 给定两个字符串s和t,决定它们是否是同构的. 假设s中的元素被替换能够得到t,那么称这两个字符串是同构的. 在用一个字符串的元素替换还有一个字符串的元素的过程中.所有字符的顺序必须保留. 没有两 ...
- LeetCode 205. Isomorphic Strings (同构字符串)
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...
- Leetcode 205 Isomorphic Strings 字符串处理
判断两个字符串是否同构 hs,ht就是每个字符出现的顺序 "egg" 与"add"的数字都是122 "foo"是122, 而"ba ...
- LeetCode 205 Isomorphic Strings
Problem: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if ...
- [LeetCode] 205. Isomorphic Strings 解题思路 - Java
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...
- Java for LeetCode 205 Isomorphic Strings
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...
随机推荐
- Django学习笔记之URL与视图
视图 视图一般都写在app的views.py中.并且视图的第一个参数永远都是request(一个HttpRequest)对象.这个对象存储了这个http请求的所有信息,其中包括携带的参数以及一些头部信 ...
- Day 08 文件操作模式,文件复制,游标
with open:将文件的释放交给with管理 with open('文件', '模式', encoding='utf-8') as f: # 操作 pass a模式:追加写入 # t ...
- VS2010+WPF+LINQ for MySQL
学习wpf,连接数据库和linq for mysql 1.参考以前博文,恢复在 Vs2010+linQ for Mysql的环境. 2.建立 wpf工程,参照1,生成 datacontext.cs , ...
- TCP TIME_WAIT过多的解决方法
总结: 最合适的解决方案是增加更多的四元组数目,比如,服务器监听端口,或服务器IP,让服务器能容纳足够多的TIME-WAIT状态连接.在我们常见的互联网架构中(NGINX反代跟NGINX,NGINX跟 ...
- docker内存监控与压测
一直运行的docker容器显示内存已经耗尽,并且容器内存耗尽也没出现重启情况,通过后台查看发现进程没有占用多少内存.内存的监控使用的是cadvisor,计算方式也是使用cadvisor的页面计算方式, ...
- ss客户端以及tcp,udp,dns代理ss-tproxy在线安装版--centos7.3 x64以上(7.3-7.6x64测试通过)
#!/bin/sh # # Script for automatic setup of an SS-TPROXY server on CentOS 7.3 Minimal. # export PATH ...
- 受限玻尔兹曼机(Restricted Boltzmann Machine, RBM) 简介
受限玻尔兹曼机(Restricted Boltzmann Machine,简称RBM)是由Hinton和Sejnowski于1986年提出的一种生成式随机神经网络(generative stochas ...
- python网页爬虫开发之五-反爬
1.头信息检查是否频繁相同 随机产生一个headers, #user_agent 集合 user_agent_list = [ 'Mozilla/5.0 (Windows NT 6.1; WOW64 ...
- 用PS做圆角图片
ps: Adobe Photoshop CS2 如果图片被锁定,请“双击”图层中“背景”解锁,如果没有图层菜单,在最上面导航栏中:窗口—图层.如下图: 点“确定”,解锁. 选用“圆角矩形工具”. ...
- mybatis入门篇:Mapper接口/关联查询/新增数据
1.数据准备 2.编写实体类 package com.forest.owl.entity; import java.util.Date; public class User { private Lon ...