题目链接
题目描述
给定一个长度为 8 的字符串 s
,只包含大小写字母和数字。
你需要计算最少需要修改 s
中的多少个字符,才能使得 s
变成目标字符串 "Nowcoder"
。
解题思路
这是一个非常基础的字符串比较问题。这个需要计算的“最少修改次数”在信息论中被称为两个等长字符串之间的汉明距离(Hamming Distance)。
核心思想
要用最少的操作次数将输入字符串 s
变为目标字符串 "Nowcoder"
,我们应该只对那些当前不匹配的字符进行修改。任何已经匹配的字符都不需要改动。
因此,问题的解法就是逐一比较两个字符串在相同位置上的字符,并统计不相同字符的个数。
算法步骤
- 定义目标字符串
target = "Nowcoder"
。 - 读取输入的字符串
s
。 - 初始化一个计数器
diff_count
为 0。 - 使用一个循环,从索引
i = 0
到7
,遍历两个字符串的每一个位置。 - 在循环的每一步,比较
s[i]
和target[i]
。 - 如果
s[i] != target[i]
,则将diff_count
加 1。 - 循环结束后,
diff_count
的值就是所求的最少修改次数。
代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s;
cin >> s;
string target = "Nowcoder";
int diff_count = 0;
for (int i = 0; i < 8; ++i) {
if (s[i] != target[i]) {
diff_count++;
}
}
cout << diff_count << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
String target = "Nowcoder";
int diffCount = 0;
for (int i = 0; i < 8; i++) {
if (s.charAt(i) != target.charAt(i)) {
diffCount++;
}
}
System.out.println(diffCount);
}
}
import sys
def solve():
try:
s = sys.stdin.readline().strip()
if not s:
return
except (IOError, ValueError):
return
target = "Nowcoder"
diff_count = 0
for i in range(8):
if s[i] != target[i]:
diff_count += 1
print(diff_count)
solve()
算法及复杂度
-
算法:字符串比较 / 线性扫描
-
时间复杂度:
。
- 因为字符串的长度是固定的 8,所以我们总是执行固定次数的比较操作。
-
空间复杂度:
。
- 我们只需要存储两个固定长度的字符串和一些计数变量,空间开销是常数级别的。