c語言給定一個字符串匹配,使用C語言解決字符串匹配問題的方法

最常想到的方法是使用KMP字符串匹配算法:

#include

#include

#include

int get_nextval(char *pattern,int next[])

{

//get the next value of the pattern

int i = 0,j = -1;

next[0] = -1;

int patlen = strlen(pattern);

while ( i < patlen - 1){

if ( j == -1 || pattern[i] == pattern[j]){

++i;

++j;

if (pattern[i] != pattern[j])

next[i] = j;

else

next[i] = next[j];

}

else

j = next[j];

}

return(0);

}

int kmpindex(char *target,char *pattern,int pos)

{

int tari = pos,pati = 0;

int tarlen = strlen(target),patlen = strlen(pattern);

int *next = (int *)malloc(patlen * sizeof(int));

get_nextval(pattern,next);

while ( tari < tarlen && pati < patlen ){

if (pati == -1 ||target[tari] == pattern[pati]){

++tari;

++pati;

}else{

pati = next[pati];

}

}

if(next != NULL) free(next);

next = NULL;

if (pati == patlen)

return tari - pati;

else

return -1;

}

int main()

{

char target[50],pattern[50];

printf("imput the target:\n" );

scanf("%s",target);

printf("imput the pattern:\n" );

scanf("%s",pattern);

int ans = kmpindex(target,pattern,0);

if (ans == -1)

printf("error\n");

else

printf("index:%d\n",ans);

return 0;

}

練習題??? 題目描述:

讀入數據string[ ],然后讀入一個短字符串。要求查找string[ ]中和短字符串的所有匹配,輸出行號、匹配字符串。匹配時不區分大小寫,并且可以有一個用中括號表示的模式匹配。如“aa[123]bb”,就是說aa1bb、aa2bb、aa3bb都算匹配。

輸入:

輸入有多組數據。

每組數據第一行輸入n(1<=n<=1000),從第二行開始輸入n個字符串(不含空格),接下來輸入一個匹配字符串。

輸出:

輸出匹配到的字符串的行號和該字符串(匹配時不區分大小寫)。

樣例輸入:

4

Aab

a2B

ab

ABB

a[a2b]b

樣例輸出:

1 Aab

2 a2B

4 ABB

ac代碼

#include

#include

#include

#define MAX 1001

#define LEN 101

struct str

{

char name[101];

};

int main()

{

struct str strs[MAX];

struct str t[LEN];

int i,n,len,j,k,left,right,count,flag;

char text[LEN],newtext[LEN];

while (scanf("%d",&n) != EOF) {

// 接收數據

getchar();

for (i = 0; i < n; i ++) {

scanf("%s",strs[i].name);

}

// 接收文本串

getchar();

gets(text);

len = strlen(text);

for (i = left = right = 0; i < len; i ++) {

if (text[i] == '[') {

left = i;

} else if (text[i] == ']') {

right = i;

break;

}

}

count = right - left - 1;

if (count <= 0) { // 沒有正則匹配

for (i = j = 0; i < len; i ++) {

if (text[i] != '[' && text[i] != ']') {

newtext[j ++] = text[i];

}

}

newtext[j] = '\0';

for (i = 0; i < n; i ++) {

if (strcasecmp(strs[i].name,newtext) == 0) {

printf("%d %s\n",i + 1,strs[i].name);

}

}

}else { // 需要正則匹配

for (j = 1,k = 0; j <= count; j ++,k ++) { // 構建文本數組

memset(t[k].name,'\0',sizeof(t[k].name));

for (i = 0; i < left; i ++) {

t[k].name[i] = text[i];

}

t[k].name[i] = text[left + j];

strcat(t[k].name,text + right + 1);

}

// 正則匹配

for (i = 0; i < n; i ++) {

for (j = flag = 0; j < count; j ++) {

if (strcasecmp(strs[i].name,t[j].name) == 0) {

flag = 1;

break;

}

}

if (flag) {

printf("%d %s\n",strs[i].name);

}

}

}

}

return 0;

}

/**************************************************************

Problem: 1165

User: wangzhengyi

Language: C

Result: Accepted

Time:0 ms

Memory:948 kb

****************************************************************/

總結

如果覺得編程之家網站內容還不錯,歡迎將編程之家網站推薦給程序員好友。

本圖文內容來源于網友網絡收集整理提供,作為學習參考使用,版權屬于原作者。

小編個人微信號 jb51ccc

喜歡與人分享編程技術與工作經驗,歡迎加入編程之家官方交流群!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533164.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533164.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533164.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言比較大小 誰大選誰,C語言比較優先級

滿意答案wanggq2222018.03.14采納率&#xff1a;42% 等級&#xff1a;7已幫助&#xff1a;57人#pragma once#include#include#include #includeusing namespace std;typedef struct SymKeyVal{string key;int val;};static SymKeyVal KeyValTable[]{{"",0},{"…

c語言ip地址嗎,C語言:判斷IP地址是否合法

int is_valid_ip(const char *ip){int section 0; //每一節的十進制值int dot 0; //幾個點分隔符int last -1; //每一節中上一個字符while(*ip){if(*ip .){dot;if(dot > 3){return 0;}if(section > 0 && section <255){section 0;}else{retur…

10100的素數c語言程序,C語言基礎題目及代碼.doc

/*讀入一個自然數n&#xff0c;計算其各位數字之和&#xff0c;用漢語拼音寫出和的每一位數字。輸入格式&#xff1a;每個測試輸入包含1個測試用例&#xff0c;即給出自然數n的值。這里保證n小于10100。輸出格式&#xff1a;在一行內輸出n的各位數字之和的每一位&#xff0c;拼…

c語言閏年的判斷條件DS1302,DS1302驅動程序(平年和閏年天數自動調整)

/*********************************************************************************1.本程序能夠顯示年&#xff0c;月&#xff0c;日&#xff0c;時&#xff0c;分&#xff0c;秒&#xff0c;星期七個參數.2.時間和日期可調。可分別完成年&#xff0c;月&#xff0c;日&am…

android 圖片切割代碼,Android用clip剪切圖像資源

使用clip剪切圖像資源可以做進度條&#xff0c;圖像慢慢展開的效果&#xff0c;他使用以下幾個屬性來控制效果&#xff1a;android:drawable&#xff1a;指定要剪切的原圖像。android:clipOrientation&#xff1a;截取的方向。可取的值&#xff1a;horizontal和vertical。分別表…

android gradle錯誤,Android studio gradle錯誤與頂級異常

我最近更新了我的Android Studio,從那以后我的項目沒有構建...我得到錯誤,如下面的錯誤:Error Code:1Output:UNEXPECTED TOP-LEVEL EXCEPTION:com.android.dx.cf.iface.ParseException:class name (org/pervasivesystems/mobilehealth/activities/AppSettingsActivity$AppSetti…

Android中列表動態刪除item,如何刪除Android ExpandableListView中某個group item的child item?...

自定義了一個expandablelistview 想要刪除其中的子項list使用remove方法把list中的指定項刪除了11-09 21:04:20.585: I/MainActivity(13557): childData[{child_textsecond}, {child_textthird}]但是在expandablelistview界面顯示中&#xff0c;并沒有變化,并且還有list溢出報錯…

android 首頁廣告顯示不出來的,android – Admob插頁式廣告(全屏)不會顯示

您沒有為interstitialAd調用loadAd().廣告插播廣告應在您展示廣告之前加載.interstitialAd.loadAd(adRequest);你也應該在調用show()之前檢查它是否已加載.它可能無法立即使用,您可能希望在調用show之前提前加載它.if(mInterstitial.isLoaded()){mInterstitial.show();AdReques…

android新建項目錯誤,新建Android項目出錯

新建Android項目出以下的錯誤&#xff1a;C:\Users\txxs\workspace\4sd\res\values\styles.xml:7: error: Error retrieving parent for item: No resource found that matches the given name Theme.AppCompat.Light.[2016-11-23 11:57:46 - 4sd][2016-11-23 11:57:46 - 4sd] …

android 圖片 切換,Android 應用開發筆記 - 切換圖片(ImageSwitcher)

在面板拖拽圖標&#xff0c;然后更改相關屬性(Properties)&#xff0c;如下&#xff1a;android:id"id/imgSwit01"android:layout_width"wrap_content"android:layout_height"wrap_content" />ImageSwitcher使用的是setFactory()方法&#xf…

android layout.inflater,Android?-?LayoutInflater

在實際開發中LayoutInflater這個類還是非常有用的&#xff0c;它的作用類似于findViewById()。不同點是LayoutInflater是用來找res/layout/下的xml布局文件&#xff0c;并且實例化&#xff1b;而findViewById()是找xml布局文件下的具體widget控件(如Button、TextView等)。具體作…

android preferenceactivity 源碼,PreferenceActivity PreferenceScreen (3.0/API 11 以前)

Android提供了一個XML驅動的框架&#xff0c;用于為應用程序創建系統樣式的PreferenceScreen.(3.0/API 11 以前)是這樣使用的看代碼&#xff1a;mypreference.xmlandroid:key"PREF_AUTO_REFRESH"android:defaultValue"true"android:summary"select to…

wps 將html轉為word,用WPS快速將網頁內容轉換為WORD文檔

當過學生的都知道&#xff0c;有時查找資料&#xff0c;看到圖文并茂的網頁想要把它Copy在WORD文檔中&#xff0c;那么圖片和文字相互參雜&#xff0c;想要保存下來很復雜&#xff0c;但是如果用WPS的話&#xff0c;一切就會很簡單的&#xff0c;下面來看看WPS是怎么辦到的。1.…

鴻蒙明年可以在手機上用嗎,華為王成錄:鴻蒙已滿足在手機上使用,明年一二月份向部分用戶開放...

在2019年的華為開發者大會上&#xff0c;華為消費者業務CEO余承東正式對外發布了基于微內核的分布式操作系統-HarmonyOS(鴻蒙OS)&#xff0c;余承東表示&#xff0c;鴻蒙OS的出發點和Android、iOS都不一樣&#xff0c;它是一款全新的基于微內核的面向全場景的分布式操作系統&am…

go語言 doc轉換html,go語言使用wkhtmltopdf工具將html轉成pdf

最近收到網友的提問后端怎么把html轉成pdf文件&#xff0c;于是我就把我以前做的例子發出來給大家參考一下&#xff0c;如果對你有幫助的話請點個贊1.首先選擇適合自己的系統下載wkhtmltopdf工具mac下載后安裝成功會自動添加到環境變量 直接執行 wkhtmltopdf -V 測試是否安裝成…

java sound 多線程同一音頻文件_Java在編程語言中占據何等優勢?

現在是信息時代&#xff0c;出現了各種各樣的行業&#xff0c;在這些眾多行業里面&#xff0c;程序員算是高薪職業。在國內程序員的薪水要比其他行業高一些。也正是如此高薪的誘惑和充滿挑戰性的工作&#xff0c;令程序員近幾年來成為了備受歡迎的職業。程序員日常的工作大多是…

dlna和miracast可以共存嗎_高考化學必備之離子共存問題

發生復分解反應&#xff11;、有氣體產生。H與CO32ˉ、HCO3ˉ、SO32ˉ、HSO3ˉ、S2ˉ、HSˉ等不能共存如CO32-、S2-、HS-、HSO3-、等易揮發的弱酸的酸根與H不能大量共存&#xff0c;主要是由于CO32-&#xff0b;2H&#xff1d;CO2↑&#xff0b;H2O、HS-&#xff0b;H&#xff…

html向上浮動的方式,JS 實現Div向上浮動的實現代碼

Html 及 JS 代碼如下&#xff1a;復制代碼 代碼如下:style"position: absolute; width: 100px;">我們var newsOne document.getElementById("newsOne");newsOne.style.bottom 0;newsOne.style.left window.screen.availWidth - 100;var bottom 0;fu…

perl數組硬引用_Perl 繼續前行,Perl 7 將是下一代(硬核老王點評版)

它是默認帶有現代行為的 Perl 5&#xff0c;將為以后更大的變化奠定基礎。來源&#xff1a;https://linux.cn/article-12349-1.html作者&#xff1a;Brian D Foy譯者&#xff1a;Xingyu.Wang(本文字數&#xff1a;5043&#xff0c;閱讀時長大約&#xff1a;8 分鐘)近日 召開的 …

html文檔加載,html加載

SQL中進行Join操作時&#xff0c;可以按照以下步驟進行優化。為了方便說明&#xff0c;設表A和表B&#xff0c;且A、B表都有個名為name的列。對A、B表進行join操作。 估計表的大小。 根據每次加載數據的大小&#xff0c;來估計表大小。 也可以在Hive的數據庫存儲路徑下直接查看…