第一行输入一个长度不超过
,且仅由小写字母构成的字符串
代表小红手中待替换的串。
第二行输入一个长度不小于
但不超过
,且仅由小写字母构成的字符串
代表目标串。
在一行上输出一个整数,代表最少需要替换的次数。
abc abbc
1
需要进行一次替换,将 '
' 替换成 '
' ,此时得到 "
" ,是 "
" 的子串,因为本质上是由 "
" 末尾删除了一个字符得到的。
zzzzzz xyzabc
9
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
String t = scanner.nextLine();
scanner.close();
int sLen = s.length();
int tLen = t.length();
// 因为t的长度不小于s,所以至少有一个可能的子串
int minOperations = Integer.MAX_VALUE;
// 遍历t中所有与s长度相同的子串
for (int i = 0; i <= tLen - sLen; i++) {
int operations = 0;
// 计算将s转换为当前子串所需的操作次数
for (int j = 0; j < sLen; j++) {
char sChar = s.charAt(j);
char tChar = t.charAt(i + j);
// 计算两个字符之间的最小替换次数
operations += minSteps(sChar, tChar);
}
// 更新最小操作次数
if (operations < minOperations) {
minOperations = operations;
}
}
System.out.println(minOperations);
}
// 计算两个字符之间的最小替换次数
private static int minSteps(char a, char b) {
int diff = Math.abs(a - b);
// 替换可以向前或向后,取较小值
return Math.min(diff, 26 - diff);
}
}
using System;
using System.Collections.Generic;
public class Program {
public static int getdiff(char a, char b ){//c# 静态方法(main)不能调用非静态方法
int diff = Math.Abs(a-b);
return Math.Min(diff, 26-diff);
}
public static void Main() {
string line;
string a,b;
a=System.Console.ReadLine();
b=System.Console.ReadLine();
int n=a.Length;
int m =b .Length;
int ans= int.MaxValue;
for(int i=0;i<=m-n;++i){
int tmp =0;
for(int j=0;j<n;++j){
tmp+= getdiff(a[j] ,b[i+j] );
}
ans=Math.Min(tmp,ans);
}
Console.WriteLine(ans);
}
} #include <climits>
#include <iostream>
using namespace std;
int min_dis(char a,char b){
int s1=abs(b-a),s2=26-s1;
return min(s1,s2);
}
int main() {
string s;cin>>s;
string t;cin>>t;
int minn=INT_MAX;
for(int i=0;i<=t.size()-s.size();i++){
int cnt=0;
for(int j=0;j<s.size();j++){
cnt+=min_dis(s[j],t[i+j]);
}
if(minn>cnt) minn=cnt;
}
cout<<minn;
} 暴力枚举嗯对
#include <iostream>
using namespace std;
#include <string>
#include <cmath>
#include <climits>
int main(){
string s, t;
cin >> s >> t;
int m = s.size();
int n = t.size();
//计算每个滑动窗口的最小代价,比较更新
int min_cost = INT_MAX;
for(int i = 0; i <= n - m; ++i){
int cost = 0;
for(int j = 0; j < m; ++j){
int a = abs(s[j] - t[i+j]);
int b = min(a, 26 - a);
cost += b;
}
if(cost < min_cost) min_cost = cost;
}
cout << min_cost << endl;
return 0;
} #include <iostream>
using namespace std;
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
int main() {
string s,t;
cin>>s>>t;
int window_len=s.size();
int minstep=999999;
for(int i=0;i<t.size()-(window_len-1);i++){
int window_step=0;
for(int j=0;j<window_len;j++){//滑动窗口滑动t串 统计每一次s串变成窗口内的串的步骤
char charbegin=s[j];
char chartarget=t[i+j];
// cout<<charbegin<<"->"<<chartarget<<' ';
// cout<<"abs:"<<j<<"::"<<min(abs(charbegin-chartarget),26-abs(charbegin-chartarget))<<endl; test
window_step+=min(abs(charbegin-chartarget),26-abs(charbegin-chartarget));
}
minstep=min(minstep,window_step);
}
cout<<minstep;
}