首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
Bubble Sort - 冒泡排序
Selection Sort - 选择排序
Insertion Sort - 插入排序
Merge Sort - 归并排序
Quick Sort - 快速排序
Heap Sort - 堆排序
Bucket Sort
Counting Sort
两数之和
两数相加
无重复字符的最长子字符串
两个排序数组的中值
最长回文子串
锯齿形变换
反转整数
合并K个排序列表
链表循环
除Self之外的数组乘积
4的威力
蛙跳
将交叉口大小设置为至少两个
最大的块,使其分类
到达点
阶乘零点函数的前像大小
建造一个大的岛屿
唯一字母串
树的距离之和
猜词游戏
节点的最短路径
矩形区域II
K-相似字符串
雇佣K工人的最低成本
至少为K的最短子阵
获取所有key的最短路径
加油站的最小数量
有利可图的计划
细分图中的可达节点
超级蛋掉落
最大频率叠加
有序队列
DI序列的有效置换
猫和老鼠
最长不含重复字符的子字符串
丑数
第一个只出现一次的字符
字符流中第一个不重复的字符
两个链表的第一个公共结点
数字在排序数组中出现的次数
0到n-1中缺失的数字
数组中数值和下标相等的元素
二叉树的深度
数组中只出现一次的两个数字
数组中唯一只出现一次的数字
翻转单词顺序
左旋转字符串
滑动窗口的最大值
当前位置:
首页>>
技术小册>>
数据结构与算法(中)
小册名称:数据结构与算法(中)
难度: Hard 题意: 1. 给定两个字符串,问最少要交换多少次,使得A变成了B,A和B里面的字母都是a-f 思路: - 将字符串A到字符串B的变换看成图,那么这张图就是一个一个环构成的。环上,交换的次数等于环的长度-1,所以这个题目变成了,将图拆成环,使环的个数最大 - 后面就是纯搜索,注意状态合并。状态定义为,当前图的状态(6*6的矩阵),然后在图上寻找所有的可行环,分别去掉,转成下一个状态 代码: ```java class Solution { private class State implements Comparable<State> { int[] a; int total; State() { a = new int[6]; Arrays.fill(a, 0); total = 0; } State(int[] a, int total) { this.a = Arrays.copyOf(a, a.length); this.total = total; } private int get(int x, int y) { return (a[x] >> (y * 4)) & 15; } private void minus(int x, int y) { a[x] -= 1 << (y * 4); total--; } private void add(int x, int y) { a[x] += 1 << (y * 4); total++; } @Override public int compareTo(State o) { if (Integer.compare(total, o.total) == 0) { for (int i = 0;i < 6;i++) { if (Integer.compare(a[i], o.a[i]) != 0) { return Integer.compare(a[i], o.a[i]); } } return 0; } else { return -Integer.compare(total, o.total); } } } private void extand(boolean[] flag, int[] pos, TreeMap<State, Integer> stateMap, State current, int idx) { if (current.get(pos[idx - 1], pos[0]) != 0) { State next = new State(current.a, current.total); for (int i = 0;i < idx - 1;i++) { next.minus(pos[i], pos[i + 1]); } next.minus(pos[idx - 1], pos[0]); int value = stateMap.get(current); value += idx - 1; if (stateMap.containsKey(next)) { value = value < stateMap.get(next) ? value : stateMap.get(next); stateMap.put(next, value); } else { stateMap.put(next, value); } } if (idx == 6) { return; } for (int i = 0;i < 6;i++) { if (!flag[i] && current.get(pos[idx - 1], i) != 0) { flag[i] = true; pos[idx] = i; extand(flag, pos, stateMap, current, idx + 1); flag[i] = false; } } } private void solve(TreeMap<State, Integer> stateMap, State current) { boolean[] flag = new boolean[6]; Arrays.fill(flag, false); int[] pos = new int[6]; int min = -1; for (int i = 0;i < 6;i++) { if (current.a[i] != 0) { min = i; break; } } if (min == -1) { return; } flag[min] = true; pos[0] = min; extand(flag, pos, stateMap, current, 1); } public int kSimilarity(String A, String B) { TreeMap<State, Integer> stateMap = new TreeMap<State, Integer>(); State start = new State(); for (int i = 0;i < A.length();i++) { if (A.charAt(i) != B.charAt(i)) { start.add(A.charAt(i) - 'a', B.charAt(i) - 'a'); } } int ret = 0x3fffffff; stateMap.put(start, 0); while (!stateMap.isEmpty()) { State current = stateMap.firstKey(); if (current.total == 0) { ret = ret < stateMap.get(current) ? ret : stateMap.get(current); } else { solve(stateMap, current); } stateMap.remove(current); } return ret; } } ```
上一篇:
矩形区域II
下一篇:
雇佣K工人的最低成本
该分类下的相关小册推荐:
数据结构与算法之美
数据结构与算法(上)
业务开发实用算法精讲
算法面试通关 50 讲
数据结构与算法(下)
编程之道-算法面试(上)
编程之道-算法面试(下)