行程长度编码

GitHub跳转原题关系图返回列表

先统一为大写,再按连续相同字符分段输出行程长度编码。

OJ: noi_openjudge

题目 ID: ch0107-32

难度:入门

标签:字符串模拟python

日期: 2026-07-30 23:01

题意

对大小写不敏感的字母串做行程长度编码,格式为 (字符,次数)

思路

upper() 使大小写相同的字母合并,再用与 p 型编码相同的连续段扫描,按要求拼出括号格式。

代码

cpp
#include <cstdio>
#include <cstring>

char s[1005];
int main(){
    scanf("%s",s+1);
    int cnt = 1;
    int len = strlen(s+1);
    int i;
    for (i=1;i<=len+1;i++){
        if( s[i] >='a' && s[i] <='z')
            s[i] = s[i] +'A'-'a';
    }
    
    for (i=2;i<=len+1;i++){
        if( s[i] == s[i-1]){
            cnt++;
        }
        else {
            printf("(%c,%d)",s[i-1],cnt);
            cnt = 1;
        }
    }
    return 0;
}

复杂度

总结

Python代码

python
text = input().strip().upper()
parts = []
count = 1

for index in range(1, len(text) + 1):
    if index < len(text) and text[index] == text[index - 1]:
        count += 1
    else:
        parts.append(f"({text[index - 1]},{count})")
        count = 1

print("".join(parts))

C++代码

cpp
#include <cstdio>
#include <cstring>

char s[1005];
int main(){
    scanf("%s",s+1);
    int cnt = 1;
    int len = strlen(s+1);
    int i;
    for (i=1;i<=len+1;i++){
        if( s[i] >='a' && s[i] <='z')
            s[i] = s[i] +'A'-'a';
    }
    
    for (i=2;i<=len+1;i++){
        if( s[i] == s[i-1]){
            cnt++;
        }
        else {
            printf("(%c,%d)",s[i-1],cnt);
            cnt = 1;
        }
    }
    return 0;
}

复杂度

时间复杂度为 O(n)O(n),输出空间为 O(n)O(n)

总结

先做规范化,再做分段统计,可使“大小写不敏感”不干扰主循环。