一【题目类别】
二【题目难度】
三【题目编号】
四【题目描述】
如果可以通过将 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语言版