标签:保留字 思路 判断 tco top style one bar 字符替换
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s ="egg",
t ="add"
输出: true
示例 2:
输入: s ="foo",
t ="bar"
输出: false
示例 3:
输入: s ="paper",
t ="title"
输出: true
说明:
你可以假设 s 和 t 具有相同的长度。
思路:如果你用的是JAVA的话上去就直接拍hashmap就可以解决这个问题
但是如果你不会用则可以用数组标记,用一个变量top标记当前出现的字母是第几个
比如 样例的"egg",e是第一个出现的,g是第二个出现的,然后你用一个数组标记这些字符是否出现过,如果出现过,则直接把把他们的顺序赋值到ans1数组内,如果没有则标记他们是第几个出现的
这样子egg在ans1内就是122,foo也是122这样子就是同构的
foo则是122,bar则是123
就不是同构的
1 int mark[1000001]; 2 int ans1[101000],ans2[010010]; 3 bool isIsomorphic(char* s, char* t) 4 { 5 memset(mark,0,sizeof(mark)); 6 memset(ans1,0,sizeof(ans1)); 7 memset(ans2,0,sizeof(ans2)); 8 9 int len1=strlen(s),len2=strlen(t); 10 if(len1!=len2) 11 return false; 12 13 int top=1;///记录出现了几个的字符 14 for(int i=0;i<len1;i++) 15 { 16 if(mark[(int)s[i]]==0) 17 { 18 mark[(int)s[i]]=top;///标记字符 19 ans1[i]=mark[(int)s[i]];///赋值 20 top++; 21 } 22 else { 23 24 ans1[i]=mark[(int)s[i]]; 25 26 } 27 } 28 memset(mark,0,sizeof(mark)); 29 top=1; 30 for(int i=0;i<len2;i++) 31 { 32 if(mark[(int)t[i]]==0) 33 { 34 mark[(int)t[i]]=top; 35 ans2[i]=mark[(int)t[i]]; 36 top++; 37 } 38 else { 39 40 ans2[i]=mark[(int)t[i]]; 41 42 } 43 } 44 45 int flag=0; 46 for(int i=0;i<len1;i++) 47 if(ans1[i]!=ans2[i]) 48 return false; 49 50 return true; 51 }
标签:保留字 思路 判断 tco top style one bar 字符替换
原文地址:https://www.cnblogs.com/tijie/p/9905287.html