字符串的题目

POJ 1002 - 487-3279(基础)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1002
题意:略
解法:二叉查找数,map,快排...

POJ 1200 - Crazy Search(基础)@

http://acm.pku.edu.cn/JudgeOnline/problem?id=1200
题意:找出不相同的子串数量,字母表大小和子串长度会给定,这题很推荐hash入门者一做
解法:hash(建议karp-rabin)

POJ 1204 - Word Puzzles(基础)感觉可以用ac自动机在写一次

http://acm.pku.edu.cn/JudgeOnline/problem?id=1204
题意:基本多串匹配
解法:多串匹配自动机(单串去弄肯定会超时)

POJ 1229 - Wild Domains(中等)

http://acm.pku.edu.cn/JudgeOnline/problem?id=1229
题意:模糊匹配
解法:dp

POJ 1625 - Censored!(中等)

http://acm.pku.edu.cn/JudgeOnline/problem?id=1625
题意:求长度为n不包括给定模式串的字符串数量。(题意同2778,但不能按2778的方法,建议先做此题,再做2778)
解法:Aho-Corasick自动机 + dp
相关:http://hi.baidu.com/zfy0701/blog/item/c62f41afca8180ca7cd92a19.html

POJ 1743 - Musical Theme(中等)

http://acm.pku.edu.cn/JudgeOnline/problem?id=1743
题意:找一个串中最长不重叠子串
解法:后缀数组+二分枚举答案,后缀数组+栈扫描,RK+二分枚举答案
相关:http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html
POJ 1816 - Wild Words(中等,绝对的Trie应用好题,同时又是搜索好题)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1816
题意:扩展多串模式匹配(含?, *)
解法:Trie + dfs,有兴趣也可用基于位并行的自动机(可参考柔性字符串匹配,扩展匹配章节)

POJ 2185 - Milking Grid(中等)

http://acm.pku.edu.cn/JudgeOnline/problem?id=2185
题意:最小矩型的覆盖
解法:KMP (不多的KMP好题)
相关:http://acm.pku.edu.cn/JudgeOnline/showmessage?message_id=33571

POJ 2513 - Colored Sticks(基础)

http://acm.pku.edu.cn/JudgeOnline/problem?id=2513
题意:转化成欧拉回路
解法:并查集+hash,并查集+Trie

POJ 2774 - Long Long Message(中等)

http://acm.pku.edu.cn/JudgeOnline/problem?id=2774
题意:找两个串的公共最长子串
解法:后缀数组,Oracle Factor自动机,后缀自动机
相关:http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html
http://hi.baidu.com/zfy0701/blog/item/d9fedbd14581113d9b5027ab.html

POJ 2778 - DNA Sequence(中等)

http://acm.pku.edu.cn/JudgeOnline/problem?id=2778
题意:求长度为n不包括给定模式串的字符串数量。
解法:Aho-Corasick自动机(前缀树) + 矩阵快速乘法
相关:http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html
类似于1625,建议先做1625

POJ 1699 - Best Sequence(基础)

http://acm.pku.edu.cn/JudgeOnline/problem?id=1699
题意:转换为TSP问题(注意子串的包含关系!)
解法:回溯,状态dp

POJ 3376 - Finding Palindromes(中等)

http://acm.pku.edu.cn/JudgeOnline/problem?id=3376
题意:找回文串组合
解法:找出规律,然后Trie + kmp推广形式

POJ 3415 - Common Substrings(较难)

http://acm.pku.edu.cn/JudgeOnline/problem?id=3415
题意:统计两个串中长度>=k的公共子串的数量
解法:后缀数组+栈扫描,后缀自动机
相关:http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html

POJ 3080 - Blue Jeans(如果用暴力,就很简单)

http://acm.pku.edu.cn/JudgeOnline/problem?id=3080
题意:求n个串的最长公共子串
解法:后缀数组+栈扫描,后缀数组+二分枚举,暴力
相关:http://hi.baidu.com/zfy0701/blog/item/57ada7edf5f44ed1b31cb1cc.html

POJ 3208 - Apocalypse Someday(较难)

http://acm.pku.edu.cn/JudgeOnline/problem?id=3208
题意:略
解法:有意思的自动机dp

POJ 3261 - Milk Patterns(中等)

http://acm.pku.edu.cn/JudgeOnline/problem?id=3261
题意:求一个串中重复出现至少k次的最长子串
解法:后缀数组+栈扫描,hash + 二分

POJ 3294 - Life Forms(较难,强烈推荐)

http://acm.pku.edu.cn/JudgeOnline/problem?id=3294
题意:n个串中,为大于n/2个串所共有的所有最长子串
解法:后缀数组+栈扫描,暴力(很容易被卡掉),后缀数组+线段树(?)
相关:http://hi.baidu.com/zfy0701/blog/item/57ada7edf5f44ed1b31cb1cc.html

POJ 3576 - Language Recognition(中等)

http://acm.pku.edu.cn/JudgeOnline/problem?id=3576
题意:求一个dfa,它满足两个条件,1、能识别所有词的dfa,2、要求状态数最少。
解法:trie + hash
相关:http://hi.baidu.com/zfy0701/blog/item/b8332b5cd90e7b45fbf2c033.html

POJ 3581 - Sequence(中等)

http://acm.pku.edu.cn/JudgeOnline/problem?id=3581
题意:把原串分三段并反转,求字典序最小的那串
解法:后缀数组
本来觉得很水,但却是我目前做得最失败的一道后缀数组题

POJ 3630 - Phone List(基础,强烈推荐用此题练Trie)

http://acm.pku.edu.cn/JudgeOnline/problem?id=3630
题意:给n个串,看是否有一个串是另一个串的前缀
解法:快排,Trie

POJ 3690 - Constellations(基础)

http://acm.pku.edu.cn/JudgeOnline/problem?id=3690
题意:二维串匹配
解法:转换为一维,或者用多串匹配

POJ 3691 - DNA repair(中等)

http://acm.pku.edu.cn/JudgeOnline/problem?id=3691
题意:修复非法字符串需要替换的最少字符数
解法:动态规划,如果使用AC自动机去做dp的话比较简单且只需要二维,用dp[j]表示第i个字符时,第j种状态(不是非法状态)所需要最小的修改量

POJ 3693 - Maximum repetition substring(难)

http://acm.pku.edu.cn/JudgeOnline/problem?id=3693
题意:求最循环节最多的子串
解法:我所知道的最好的做法应该是先做s-factorization(也就是lempel-ziv),然后在分解之后的每一段中枚举周期,周期可以通过 推导关系式确定是否合法,然后可确定循环次数,取最大的,中间还用到了对kmp的扩展。具体来说有KK算法,和ML算法两种,其中ML不能遍历所有的 runs。

其他OJ:


SPOJ 2743 - Prefix Tiling

http://www.spoj.pl/problems/PRETILE/
找规律

空罐 Cans(这个自动机dp还是有意思的)

http://cat.nknush.kh.edu.tw/ZeroJudge/ShowProblem?problemid=b179

HDOJ 2471 - History of Languages(杭州现场赛)

http://acm.hdu.edu.cn/showproblem.php?pid=2471
自动机的等价性,划分集合的dp
### C语言字符串编程题目 以下是几个典型的关于C语言字符串操作的编程题目,适合用于练习和巩固基础知识: #### 题目一:反转字符串 编写一个函数 `reverseString` 来实现字符串的反转功能。输入一个字符串并将其字符顺序颠倒后输出。 ```c #include <stdio.h> #include <string.h> void reverseString(char str[]) { int length = strlen(str); for (int i = 0; i < length / 2; i++) { char temp = str[i]; str[i] = str[length - i - 1]; str[length - i - 1] = temp; } } int main() { char str[100]; printf("请输入一个字符串: "); scanf("%s", str); reverseString(str); // 调用反转函数 printf("反转后的字符串为:%s\n", str); return 0; } ``` 此代码实现了基本的字符串反转逻辑[^1]。 --- #### 题目二:统计字符串中的单词数量 编写一个程序来统计给定字符串中包含多少个单词(假设单词之间由空格分隔)。 ```c #include <stdio.h> #include <ctype.h> #include <string.h> int countWords(const char *str) { int wordCount = 0; int insideWord = 0; while (*str != '\0') { if (!isspace(*str)) { // 如果当前字符不是空白符 if (!insideWord) { // 进入新单词 insideWord = 1; wordCount++; } } else { // 当前字符为空白符 insideWord = 0; } str++; // 移动指针到下一个字符 } return wordCount; } int main() { const char input[] = "这是一个测试字符串"; int result = countWords(input); printf("字符串 \"%s\" 中有 %d 个单词。\n", input, result); return 0; } ``` 该算法通过判断连续非空白字符组的数量来统计单词数目[^2]。 --- #### 题目三:删除指定字符 编写一个函数 `removeChar` 删除字符串中所有的某个特定字符,并返回修改后的字符串长度。 ```c #include <stdio.h> #include <string.h> int removeChar(char str[], char ch) { int writeIndex = 0; for (int readIndex = 0; str[readIndex] != '\0'; readIndex++) { if (str[readIndex] != ch) { str[writeIndex++] = str[readIndex]; // 复制非目标字符 } } str[writeIndex] = '\0'; // 添加字符串结束标志 return writeIndex; // 返回新的字符串长度 } int main() { char str[100], targetCh; printf("请输入原始字符串: "); fgets(str, sizeof(str), stdin); str[strcspn(str, "\n")] = '\0'; // 去除换行符 printf("要移除的目标字符: "); scanf("%c", &targetCh); int newLength = removeChar(str, targetCh); printf("处理后的字符串为:%s\n", str); printf("新字符串长度为:%d\n", newLength); return 0; } ``` 这段代码展示了如何遍历字符串并跳过不需要保留的字符[^3]。 --- ### 总结 以上三个例子涵盖了常见的字符串操作技巧,包括反转、分割以及过滤等功能。这些基础技能对于掌握更复杂的字符串处理非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值