模式匹配
好像回到小学语文课堂~ 🤣
老师:ABB式 大家能想出哪些呀~😊
我:绿油油~😁 金灿灿~😁
哈哈哈哈哈 好啦,来看算法题~
LeetCode 205 同构字符串
-
哈哈哈哈 怎么判断 绿油油 和 金灿灿 是同一模式的字符串呢?😂
-
思路 :把字符串的每一个字符都赋予一个数字(出现顺序),然后转变成可比较的模式字符串就好啦~
-
对于给定的字符串,我们通过将每个字符替换为其第一次出现的索引来构建一个模式字符串。例如,字符串 “abb” 可以转换为模式 “122”,因为 ‘a’ 对应 1,‘b’ 对应 2。
-
比如说 a b b——>1 2 2 ; mee——>1 2 2 ; aqq——>1 2 2
-
abcdd——>1 2 3 4 4 acbee——>1 2 3 4 4
-
代码:哈希表 + 字符串
// 主函数,判断两个字符串是否同构
public boolean isIsomorphic(String s, String t) {
// 将字符串 s 和 t 转换成它们的模式字符串
String s1 = convertPatternStr(s);
String s2 = convertPatternStr(t);
// 比较两个模式字符串是否相同,如果相同则返回 true,表示 s 和 t 是同构的
return s1.equals(s2);
}
// 辅助函数,将输入的字符串转换成模式字符串
public static String convertPatternStr(String s) {
// 创建一个数组来映射字符到数字
int[] map = new int[128]; // 128 是 ASCII 码字符集的大小
StringBuilder sb = new StringBuilder();
int cnt = 1; // 计数器,用来分配映射的数字
// 遍历字符串 s 的每个字符
for (char c : s.toCharArray()) {
// 如果当前字符还没有映射到数字,则进行映射
if (map[c] == 0) {
map[c] = cnt; // 将当前字符映射到当前的数字 cnt
++cnt; // 递增计数器,为下一个新字符映射准备数字
}
// 将映射后的数字添加到结果字符串 sb 中,以空格分隔每个数字,防止出现11 1 和1 11的情况
sb.append(map[c]).append(" ");
}
// 返回最终的模式字符串
return sb.toString();
}
LeetCode 890 查找和替换模式
- 同上呀,只不过是需要一个一个比较哈哈哈哈
public List<String> findAndReplacePattern(String[] words, String pattern) {
List<String> list = new ArrayList<>();
String p = convertPatternStr(pattern);
for(String word : words){
if(word.equals(p)||convertPatternStr(word).equals(p)) list.add(word);
}
return list;
}
public static String convertPatternStr(String s){
int[] map = new int[128];
StringBuilder sb = new StringBuilder();
int cnt = 1;
for(char c: s.toCharArray()){
if(map[c]==0){
map[c] = cnt;
++cnt;
}
sb.append(map[c]).append(" ");
}
return sb.toString();
}
LeetCode 290 单词规律
-
绿油油 金灿灿 万变不离其宗
-
核心思路还是转化成同样的模式字符串!
public boolean wordPattern(String pattern, String s) {
// 将 pattern 转换为模式字符串
String s1 = convertPattern(pattern);
// 将字符串 s 转换为模式字符串
String s2 = convertString(s);
// 比较两个模式字符串是否相同
return s1.equals(s2);
}
// 将 pattern 转换为模式字符串
public static String convertPattern(String pattern){
// 使用一个数组来映射字符到它们的第一次出现位置(从1开始)
int[] map = new int[128];
int cnt = 1;
StringBuilder sb = new StringBuilder();
for(char c:pattern.toCharArray()){
if(map[c]==0){
map[c] = cnt;
++cnt;
}
sb.append(map[c]);
}
return sb.toString();
}
// 将字符串 s 转换为模式字符串
public static String convertString(String s){
// 将字符串按空格分割成单词数组
String[] words = s.split(" ");
int cnt =1;
HashMap<String,Integer> map = new HashMap<>();
StringBuilder sb = new StringBuilder();
for(String word : words){
// 如果单词不在哈希表中,将其加入,并分配一个唯一的序号(从1开始)
if(!map.containsKey(word)){
map.put(word,cnt);
++cnt;
}
sb.append(map.get(word));
}
return sb.toString();
}