一【题目类别】
二【题目难度】
三【题目编号】
四【题目描述】
- 如果可以通过将 A 中的两个小写字母精确地交换位置 K 次得到与 B 相等的字符串,我们称字符串 A 和 B 的相似度为 K(K 为非负整数)。
- 给定两个字母异位词 A 和 B ,返回 A 和 B 的相似度 K 的最小值。
五【题目示例】
- 示例 1:
输入:A = “ab”, B = “ba”
输出:1 - 示例 2:
输入:A = “abc”, B = “bca”
输出:2 - 示例 3:
输入:A = “abac”, B = “baca”
输出:2 - 示例 4:
输入:A = “aabc”, B = “abca”
输出:2
六【题目提示】
- 1 <= A.length == B.length <= 20
- A 和 B 只包含集合 {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’} 中的小写字母。
七【解题思路】
- 使用队列存放每一次修改的状态,找A离得最近的和B一样的位置交换,退出条件是A和B修改为相等的字符串
八【时间频度】
- 时间复杂度:没分析出来,看题解的也没看太懂,反正复杂度包括状态的数量和字符串的长度,具体什么样暂时没分析出来`(>﹏<)′
九【代码实现】
- Java语言版
package BFS;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
public class p854_KSimilarStrings {
public static void main(String[] args) {
String A = "abac";
String B = "baca";
int res = kSimilarity(A, B);
System.out.println("交换了" + res + "次");
}
public static int kSimilarity(String A, String B) {
Queue<String> q = new LinkedList<>();
Set<String> visit = new HashSet();
q.add(A);
visit.add(A);
int step = 0;
while (!q.isEmpty()) {
for (int k = q.size(); k > 0; k--) {
String cur = q.poll();
if (cur.equals(B)) {
return step;
}
int i = 0;
while (i < A.length() && cur.charAt(i) == B.charAt(i)) {
i++;
}
for (int j = i + 1; j < A.length(); j++) {
if (cur.charAt(j) == B.charAt(j) || B.charAt(j) != cur.charAt(i)) {
continue;
}
StringBuilder sb = new StringBuilder(cur);
sb.setCharAt(i, cur.charAt(j));
sb.setCharAt(j, cur.charAt(i));
String next = sb.toString();
if (!visit.contains(next)) {
visit.add(next);
q.add(next);
}
}
}
step++;
}
return -1;
}
}
- C语言版
#define _CRT_SECURE_NO_WARNINGS
#include<stdint.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<uthash.h>
typedef struct myStruct
{
char val[21];
UT_hash_handle hh;
}Node;
Node *map;
char que[20000][21];
int cnt, head, tail;
void Swap(char *a, char *b)
{
char c = *a;
*a = *b;
*b = c;
}
void Enque(char *a)
{
strcpy(que[head], a);
head++;
head %= 20000;
cnt++;
}
void Deque(char *a)
{
strcpy(a, que[tail]);
tail++;
tail %= 20000;
cnt--;
}
void ClearHash()
{
Node *s, *tmp;
HASH_ITER(hh, map, s, tmp);
{
HASH_DEL(map, s);
free(s);
}
}
int kSimilarity(char * A, char * B)
{
if (strcmp(A, B) == 0)
{
return 0;
}
cnt = 0;
head = 0;
tail = 0;
map = NULL;
int wordLen = strlen(A);
char *c = calloc(wordLen + 1, sizeof(char));
char *c1 = calloc(wordLen + 1, sizeof(char));
int res = 0;
Node *s = calloc(1, sizeof(Node));
strcpy(s->val, A);
HASH_ADD_STR(map, val, s);
Enque(A);
while (cnt > 0)
{
int queLen = cnt;
for (int i = 0; i < queLen; i++)
{
Deque(c);
int k = 0;
while (c[k] == B[k])
{
k++;
}
for (int j = k + 1; j < wordLen; j++)
{
if (c[j] == B[k])
{
strcpy(c1, c);
Swap(&c1[j], &c1[k]);
}
if (strcmp(c1, B) == 0)
{
free(c);
free(c1);
ClearHash();
return res + 1;
}
HASH_FIND_STR(map, c1, s);
if (s == NULL)
{
s = calloc(1, sizeof(Node));
strcpy(s->val, c1);
HASH_ADD_STR(map, val, s);
Enque(c1);
}
}
}
res++;
}
free(c);
free(c1);
ClearHash();
return 0;
}
十【提交结果】
- Java语言版

- C语言版
