题解 | #字符串距离#

字符串距离

https://www.nowcoder.com/practice/c0ccc2e437f0473e8e5ebb7703c24089

解题思路

  1. 题目要求计算字符串 中所有长度为 的子串的距离和
  2. 字符串距离定义:对应位置字符不同的数量
  3. 解题策略:
    • 使用滑动窗口统计当前窗口中'a'和'b'的数量
    • 对于 中的每个字符,根据它与 中对应位置字符的不同来累加距离
    • 当窗口移动时,更新字符计数

代码

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s, t;
    cin >> s >> t;
    
    long long lens = s.length();
    long long lent = t.length();
    long long count_a = 0, count_b = 0, total = 0;
    int pos = 0;
    
    // 遍历字符串S
    for(int i = 0; i < lens; i++) {
        // 统计T中字符数量
        if(i < lent) {
            if(t[i] == 'a') count_a++;
            else count_b++;
        }
        
        // 计算距离
        if(s[i] == 'a') {
            total += count_b;  // 与'b'不同
        } else {
            total += count_a;  // 与'a'不同
        }
        
        // 更新滑动窗口
        if(i >= lens - lent) {
            if(t[pos++] == 'a') count_a--;
            else count_b--;
        }
    }
    
    cout << total << endl;
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        String t = sc.next();
        
        long lens = s.length();
        long lent = t.length();
        long countA = 0, countB = 0, total = 0;
        int pos = 0;
        
        // 遍历字符串S
        for(int i = 0; i < lens; i++) {
            // 统计T中字符数量
            if(i < lent) {
                if(t.charAt(i) == 'a') countA++;
                else countB++;
            }
            
            // 计算距离
            if(s.charAt(i) == 'a') {
                total += countB;  // 与'b'不同
            } else {
                total += countA;  // 与'a'不同
            }
            
            // 更新滑动窗口
            if(i >= lens - lent) {
                if(t.charAt(pos++) == 'a') countA--;
                else countB--;
            }
        }
        
        System.out.println(total);
    }
}
s = input()
t = input()

lens = len(s)
lent = len(t)
count_a = count_b = total = pos = 0

# 遍历字符串S
for i in range(lens):
    # 统计T中字符数量
    if i < lent:
        if t[i] == 'a':
            count_a += 1
        else:
            count_b += 1
    
    # 计算距离
    if s[i] == 'a':
        total += count_b  # 与'b'不同
    else:
        total += count_a  # 与'a'不同
    
    # 更新滑动窗口
    if i >= lens - lent:
        if t[pos] == 'a':
            count_a -= 1
        else:
            count_b -= 1
        pos += 1

print(total)

算法及复杂度

  • 算法:滑动窗口
  • 时间复杂度: - 只需要遍历一次字符串S
  • 空间复杂度: - 只需要常数级别的额外空间
全部评论

相关推荐

家人们,我现在真的好纠结。我是26届的,目前还没有实习过。我现在的情况是,想参加秋招,但是感觉自己的简历特别空,没有实习经历会不会秋招直接凉凉啊?可我又听说现在很多公司对26届实习生也不太感冒,说什么不确定性大。而且我最近在准备考公,时间上也有点冲突。要是把时间花在实习上,备考时间就少了。但要是不实习,又怕以后就业有问题😫有没有懂行的友友帮我分析分析:26届现在不实习,秋招找工作真的会很难吗?考公和实习该怎么平衡啊?如果现在不实习,考完公再去找实习还来得及吗?真的太焦虑了,希望大家能给我点建议🙏
小破站_程序员YT:我可能和大家的观点不一样。人的精力是有限的,不能既要还要。你又想实习又想考公最后又要秋招上岸,我觉得哪有那么多的选择。你如果想考上岸,那就全力以赴。如果想秋招上岸,就继续投实习,投没了,就继续准备秋招,秋招不行继续春招。别到最后,考公没上岸,觉得是花了时间浪费在找实习上了, 秋招没上岸,觉得是浪费时间准备考公去了。我是认为很难说可以去平衡 不喜勿喷,可以叫我删除
点赞 评论 收藏
分享
点赞 评论 收藏
分享
每晚夜里独自颤抖:把华北改为华南再试一试,应该就没啥问题了。改完可能都不用投,别人主动联系了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务