回文问题 - 我在这里做错了什么?

Palindrome problem - What am I doing wrong Here?

问题陈述: 给你一个二进制字符串 S 和一个整数 K。在一个操作中,你可以选择任何位并将其翻转,即将 0 变为 1 或将 1 变为 0。你可以使用恰好 K 操作使字符串 S 成为回文吗?

如果可能就打印 YES,否则打印 NO。

输入格式 输入的第一行包含一个整数T,表示测试用例的数量。 T 测试用例的描述如下。 每个测试用例由两行输入组成。 每个测试用例的第一行包含两个 space 分隔的整数 N 和 K,表示二进制字符串的长度和要执行的操作数。 第二行包含二进制字符串 S。 输出格式 对于每个测试用例,在新行上打印答案——如果 S 可以使用恰好 K 次操作成为回文,则为 YES,否则为 NO。

YES 和 NO 的每个字符都可以大写或小写打印(例如,yes、yEs、Yes 都将被视为相同)。

我的解决方案:

T = int(input())
for i in range(T):
    N,K = map(int,input().split())
    S = input()
    counter = 0
    for i in range(int(len(S)/2)):
        if S[i] == S[-1-i]:
            continue
        else:
            counter = counter + 1
    if counter == K:
        print("Yes")
    else:
        print("No")

但是在提交时,它显示错误的答案,而在自定义输入时,它显示正确的输出,有人可以指出我做错了什么吗?

可能是因为您使用的是 len(S) 而不是 N

可能是另一个问题。请记住,问题是“你能否在 K 步内将其转换为回文”,而不是“你能否在最少 K 步内将其转换为回文”。

如果您发现可以在少于 K 步的时间内完成,则必须弄清楚是否可以在 K 步内完成。对于偶数回文​​,您可以翻转位对,或者翻转相同的位偶数次。对于奇数回文,你可以把中心位翻来覆去。

#include 使用命名空间标准;

int main(){
    int t,n,k,i,j,c;
    cin>>t;
    while(t--){
        cin>>n>>k;
        char str[n];
        for( i=1;i<=n;i++){
            cin>>str[i];
        }
        str[0]=i;
        str[n-1]=j;
        while(i<=j){
            if(str[i++]!=str[j--]){
                c--;
            }
            
        }
        if(c=k){
            cout<<"YES"<<endl;
        }
        else{
            cout<<"NO"<<endl;
        }
        
        
    }
    return 0;
}