1208. 翻硬币
题意:
- 给定一个初始字符串(只含
*
和o
字符) - 给定一个目标字符串(只含
*
和o
字符) - 翻转初始字符串,每次会同时翻转其相邻的两个字符
- 求初始字符串翻转到目标字符串的最小翻转次数
- 输入的数据保证一定有解
思路1:
- 暴力枚举出所有的翻转情况:时间复杂度为
2
99
2^{99}
299大概为6e,明显会超出时间范围
思路2:
- 本题相当于费解的开关的一维简化问题
- 同时扫描两个串(最后一个字符不用管),只要字符不相同就翻转初始字符串当前位置相邻两个字符
import java.util.*;
class Main {
Scanner s = new Scanner(System.in);
String s1;
String s2;
public void run() {
s1 = s.next();
s2 = s.next();
int step = 0;
for (int i = 0; i < s1.length() - 1; i++) {
if (s1.charAt(i) != s2.charAt(i)) {
s1 = turn(s1, i);
step++;
}
}
System.out.println(step);
}
public String turn(String s, int i) {
char[] c = s.toCharArray();
c[i] = c[i] == '*' ? 'o' : '*';
c[i + 1] = c[i + 1] == '*' ? 'o' : '*';
return new String(c);
}
public static void main(String[] args) {
new Main().run();
}
}