Road to Coder _String
Posted 520-42
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Road to Coder _String相关的知识,希望对你有一定的参考价值。
周次 |
学习时间 |
新编写代码行数 |
博客量(篇) |
学到知识点 |
第8周 |
|
约200 |
1 |
串的基本操作
|
1 #include"stdio.h" 2 #include"stdafx.h" 3 #include"stdlib.h" 4 #include"windows.h" 5 #include"conio.h" 6 #include"string.h" 7 8 #pragma warning(disable 4996) 9 10 #define MAXLEN 50 11 12 typedef struct 13 { 14 char str[MAXLEN]; 15 int len; 16 }String; 17 18 void PrintString(String s); 19 void StrDelete(String *s, int pos, int len); 20 void StrInsert(String *s, int pos, String t); 21 void StrCompare(String s, String t); 22 void Index_BF(String s, String t); 23 void Get_next(String t, int next[50]); 24 void Index_KMP(String s, String t); 25 26 27 void main() 28 { 29 int pos =0; 30 int len = 0; 31 String temp; 32 String MyString; 33 printf("请输入一个字符串:"); 34 gets_s(MyString.str); 35 MyString.len = strlen(MyString.str); 36 PrintString(MyString); 37 38 printf("请输入第二个字符串:"); 39 gets_s(temp.str); //临时变量二次利用 40 temp.len = strlen(temp.str); 41 StrCompare(MyString, temp); 42 43 printf("\\n对以上两个字符串的BF匹配后:"); 44 Index_BF(MyString,temp); 45 printf("\\n对以上两个字符串的KMP匹配后:"); 46 Index_KMP(MyString,temp); 47 system("pause"); 48 49 printf("请输入要插入的字符:"); 50 gets_s(temp.str); 51 temp.len = strlen(temp.str); 52 printf("请输入要插入的位置:"); 53 scanf_s("%d", &pos); 54 StrInsert(&MyString,pos,temp); 55 PrintString(MyString); 56 57 printf("\\n请输入删除的位置以及长度:"); 58 scanf_s("%d%d",&pos,&len); 59 StrDelete(&MyString,pos,len); 60 PrintString(MyString); 61 62 system("pause"); 63 } 64 65 void PrintString(String s) 66 { 67 int i; 68 for (i = 0; i < s.len; i++) 69 { 70 printf("%c",s.str[i]); 71 } 72 printf("\\n"); 73 } 74 75 void StrInsert(String *s, int pos, String t) //在串s下标为pos的地方插入串t 76 { 77 78 int i; 79 if (pos<0 || pos> s->len) printf("插入位置不合法!"); 80 else 81 if (s->len + t.len <= MAXLEN) 82 { 83 for (i = s->len + t.len - 1; i >= t.len + pos-1; i--) 84 s->str[i] = s->str[i - t.len]; 85 for (i = 0; i < t.len; i++) 86 s->str[i + pos] = t.str[i]; 87 s->len = s->len + t.len; 88 } 89 else if (pos + t.len <= MAXLEN) 90 { 91 for (i = MAXLEN - 1; i > t.len + pos - 1; i--) s->str[i] = s->str[i - t.len]; 92 for (i = 0; i < t.len; i++) s->str[i=pos] = t.str[i]; 93 s->len = MAXLEN; 94 } 95 else if (s->len + t.len > MAXLEN) 96 { 97 for (i = 0; i < MAXLEN - pos; i++) s->str[i + pos] = t.str[i]; 98 } 99 } 100 101 void StrDelete(String *s, int pos, int len) //删除pos后len个元素 102 { 103 int i; 104 if (pos < 0 || pos>(s->len - len)) 105 { 106 printf("删除参数不合法!"); 107 } 108 else 109 for (i = pos + len; i < s->len; i++) 110 { 111 s->str[i - len] = s->str[i]; 112 113 } 114 s->len = s->len - len; 115 } 116 117 void StrCompare(String s, String t) 118 { 119 int i,result=0; 120 for (i = 0; i < s.len && i < t.len; i++) 121 if (s.str[i] != t.str[i]) 122 result = s.str[i] - t.str[i]; 123 else 124 result = s.len - t.len; 125 126 if (result == 0) 127 printf("(%s)和(%s)两串相等!", s.str, t.str); 128 else if (result > 0) 129 printf("(%s)较大\\n", s.str); 130 else 131 printf("(%s)较大\\n", t.str); 132 133 } 134 135 136 void Index_BF(String s, String t) //Brute Force 暴力匹配算法 137 { 138 int slen = strlen(s.str); 139 int tlen =strlen(t.str); 140 int i = 0; 141 int j = 0; 142 while (i <slen && j< tlen) 143 { 144 if(s.str[i] == t.str[j]) 145 { 146 i++; 147 j++; 148 } 149 else 150 { 151 i = i - j + 1; 152 j = 0; 153 } 154 } 155 if (i >= tlen) 156 printf("匹配成功,串<%s>在主串<%s>的第%d位!\\n", t.str, s.str, i - j+1); 157 else 158 printf("匹配失败!\\n"); 159 } 160 161 void Get_next(String t,int next[]) 162 { 163 int i=0, j=-1; 164 next[0] = -1; 165 while (i < t.len-1) 166 { 167 if ( j==-1 || t.str[i] == t.str[j]) 168 { 169 i++; 170 j++; 171 if (t.str[i] != t.str[j]) 172 next[i] = j; 173 else 174 next[i] = next[j]; 175 } 176 else 177 { 178 j = next[j]; 179 } 180 } 181 } 182 183 void Index_KMP(String s, String t) // Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP算法”,常用于在一个文本串S内查找一个模式串P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris三人于1977年联合发表,故取这3人的姓氏命名此算法。 184 { 185 int i = 0; 186 int j = 0; 187 int next[50]; 188 189 190 Get_next(t,next); 191192 193 while (i < s.len && j < t.len) 194 { 195 if (j==-1 || s.str[i] == t.str[j]) 196 { 197 i++; 198 j++; 199 } 200 else 201 { 202 j = next[j]; 203 } 204 } 205 if (j == t.len) 206 printf("匹配成功,串<%s>在主串<%s>的第%d位!\\n", t.str, s.str, i - j+1); //因为得到的下标从0开始,所以得到的结果+1便于验证 207 else 208 printf("匹配失败!\\n"); 209 }
以上是关于Road to Coder _String的主要内容,如果未能解决你的问题,请参考以下文章
Failed to convert property value of type ‘java.lang.String‘ to required type ‘int‘ for property(代码片段
java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.database.sqlite异常(代码片段
leetcode_1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold_[二维前缀和](代码片段