在计算机科学中,Sunday算法是一种高效的C语言字符串匹配方法,由Daniel M. Sunday于1990年提出。它比经典的KMP和Boyer-Moore算法在某些场景下更简单、更快。本教程将带你从零开始,用C语言实现Sunday算法,即使是编程小白也能轻松掌握!
Sunday算法的核心思想是:当发生不匹配时,算法会查看主串中“当前窗口后一位”的字符,并根据该字符决定模式串向右移动的距离。
例如,在主串 "abcxabcdabxabcdabcdabcy" 中查找模式串 "abcdabcy",如果某次比对失败,Sunday算法会检查主串中当前窗口后一位的字符(比如 'x'),然后根据预处理表决定跳过多少位,从而减少不必要的比较。
下面是一个完整的Sunday算法实现代码:
#include <stdio.h>#include <string.h>#define MAX_CHAR 256 // ASCII 字符总数// 构建偏移表void buildShiftTable(char* pattern, int len, int shiftTable[]) { // 初始化所有字符的偏移为模式长度 + 1 for (int i = 0; i < MAX_CHAR; i++) { shiftTable[i] = len + 1; } // 遍历模式串,记录每个字符最右出现位置到末尾的距离 for (int i = 0; i < len; i++) { shiftTable[(unsigned char)pattern[i]] = len - i; }}// Sunday 算法主函数int sundaySearch(char* text, char* pattern) { int textLen = strlen(text); int patLen = strlen(pattern); if (patLen == 0) return 0; if (textLen < patLen) return -1; int shiftTable[MAX_CHAR]; buildShiftTable(pattern, patLen, shiftTable); int i = 0; // 主串当前比对起始位置 while (i <= textLen - patLen) { int j = 0; // 逐字符比对 while (j < patLen && text[i + j] == pattern[j]) { j++; } if (j == patLen) { return i; // 找到匹配 } // 查看窗口后一位字符 if (i + patLen < textLen) { unsigned char nextChar = text[i + patLen]; i += shiftTable[nextChar]; } else { break; // 超出主串范围 } } return -1; // 未找到}// 测试函数int main() { char text[] = "abcxabcdabxabcdabcdabcy"; char pattern[] = "abcdabcy"; int pos = sundaySearch(text, pattern); if (pos != -1) { printf("匹配成功!位置:%d\n", pos); } else { printf("未找到匹配。\n"); } return 0;} buildShiftTable 函数用于构建偏移表。对于不在模式串中的字符,偏移为 len + 1,表示可以直接跳过整个窗口。sundaySearch 是核心函数,使用 while 循环不断比对并跳转。(unsigned char),防止负索引导致数组越界。相比其他高效字符串搜索算法,Sunday算法具有以下优势:
通过本教程,你已经掌握了如何用C语言实现Sunday算法。它是一种实用且高效的字符串匹配工具,适用于文本编辑器、搜索引擎等需要快速查找子串的场景。动手试试吧!修改测试用例,观察不同输入下的运行结果,加深理解。
关键词回顾:Sunday算法、C语言字符串匹配、高效字符串搜索算法、Sunday算法实现。
本文由主机测评网于2025-12-20发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251210538.html