leetcode字符串题
字符串算法
字符串翻转
第一种方法:
#include <stdio.h> #include <string.h> char * reverse(char *s ,int len, char *str) { int i=0; for(;i<len;i++) { str[i] = s[len-1-i]; } return str; } int main () { char str[12] = "Hello"; int len; len = strlen(str); printf("初始字符串:%s\n",str); char str1[len]; reverse(str,len,str1); printf("翻转后的字符串:%s",str1); return 0; }
第二种方法:
#include <stdio.h> #include <string.h> char *reverse(char *s) { char t, *p = s,*q = (s + (strlen(s) - 1)); while (p < q) { t = *p; *p++ = *q; *q-- = t; } return(s); } int main() { char str[] = "abcdefw"; printf("初始字符串:'%s'\n",str); printf("翻转后的字符串:'%s'\n", reverse(str)); return 0; }
字符串旋转
旋转分为左移和右移。
#include <stdio.h> #include <string.h> void left(char *s ,int len) { char t = s[0]; int i; for (i = 1;i<len;i++) { s[i-1] = s[i]; } s[len-1] = t; } void right(char *s ,int len) { char t = s[len-1]; int i; for (i = len - 1;i>0;i--) { s[i] = s[i-1]; } s[0] = t; } int main () { char str1[12] = "Hello"; char str2[12] = "world"; int len1,len2 ; len1 = strlen(str1); len2 = strlen(str2); //开始左移位字符串 printf("初始字符串:%s\n",str1); int i = 0; for(;i<len1;i++) { left(str1,len1); printf("第%d次移位字符串的结果:%s\n",i+1,str1); } //开始右移位字符串 printf("初始字符串:%s\n",str2); i = 0; for(;i<len2;i++) { right(str2,len2); printf("第%d次移位字符串的结果:%s\n",i+1,str2); } return 0; }
数字转字符串
#include <stdio.h> #include <string.h> //数字转换为字符串 char* hitoa(char *a,int num, int len) { int temp; int ti = num; int i = 0, j = 0; while (ti) { a[i] = ti%10 + '0'; //取最后一个数,并转换成ASCII编码值保存到字符数组中 i++; //向后移动一位,保存下一个字符 ti /= 10; //取得已经去掉几位的整数 } a[i] = '\0'; //这里一定要记住最后的'\0' i -= 1; //这里i也要注意是到最后一个非'\0'字符进行反转 for (; j < i;) { //把得到的字符串反转一下 temp= a[i]; a[i--] = a[j]; a[j++] = temp; } return a; } //计算数字位数 int Count(n){ int total = 0; while(n) { n /= 10; ++total; } return total; } int main() { int n = 2324332; int count = Count(n); printf("%d为:%d位数\n",n,count); char str[count]; hitoa(str,n,count); printf("转换后的字符串:%s\n", str); return 0; }
字符串转数字
#include <stdio.h> #include <string.h> #define MaxValue 2147483647 #define MinValue -2147483648 int StringToint32(char s[]) { //检测字符串是否为空 if (strlen(s) == 0) { return 0; } int value = 0; //存储最后的数字 int i = 0; //字符串下标 //检测正负标记 int sign = 1; //sign为数字正负标记,sign>0为正,反之为负,默认为正。 if (s[0] == '+' || s[0] == '-') { if (s[0] == '-') sign = -1; i++; //当存在标记,则从下标为1的位置开始 } while (i < strlen(s)) { int c = s[i] - '0'; //当前的数字 //当发生正溢出时,返回最大值,int类型最大值为2147483647 if (sign > 0 && (value > MaxValue / 10 || (value == MaxValue / 10 && c >= MaxValue % 10))) { value = MaxValue; break; } //当发生负溢出时,返回最小值,int类型最小值为-2147483648 else if (sign < 0 && (value > -(MinValue / 10) || (value == -(MinValue / 10) && c >= -(MinValue % 10)))) { value = MinValue; break; } //转换字符串 value = value * 10 + c; i++; } return sign > 0? value: value == MinValue ? value : -value; } int main () { char str1[] = "-4242342"; printf("%d\n",StringToint32(str1)); char str2[] = "3234"; printf("%d\n",StringToint32(str2)); return 0; }
回文字符串判断
#include <stdio.h> #include <string.h> int reverse(char *s) { if(strlen(s) == 1 || strlen(s) == 0){ return 3; } char t, *p = s,*q = (s + (strlen(s) - 1)); while (p < q) { if(*p++ == *q--) { continue; } else { return 0; } } return 1; } int main() { char str[] = "ma3d3ma"; int bool = reverse(str); printf("%d",bool); return 0; }
字符串包含
给定两个分别由字母组成的字符串 s1 和字符串 s2,如何最快地判断字符串 s2 中所有字母是否都在字符串 s1 里?
#include <stdio.h> #include <string.h> int IsContainAllChars(char a[], char b[]) { int hash = 0; int lena = strlen(a),lenb = strlen(b); for (int i = 0; i < lena; ++i) { hash |= (1 << (a[i] - 'A')); } for (int i = 0; i < lenb; ++i) { if ((hash & (1 << (b[i] - 'A'))) == 0) { return 0; } } return 1; } int main () { char a[] = "aadwada"; char b[] = "dw"; int sign = IsContainAllChars(a,b); printf("%d",sign); return 0; }
字符串删除
在s1字符串中删除掉s2字符串中出现的每一个元素。
#include <stdio.h> #include <string.h> void del_sub(char *str, char *sub) { char *p; int i, j; int asc[128] = {0}; //假设都是ACSII字符 for (p = sub; *p != '\0'; p++) { //先给要删除的字符设置位1 asc[*p] = 1; } for (i = 0, j = 0; i < strlen(str); i++) { //遍历母串,把不删的字符复制给母串, if (!asc[str[i]]) { //不需要临时空间。 str[j] = str[i]; //注意遍历时,是strlen而不用减1了,细心点。 j++; } } str[j] = '\0'; //这里要记住 } int main () { char str1[] = "abc123"; char str2[] = "c3"; del_sub(str1,str2); printf("%s",str1); return 0; }
字符串哈希
常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。
//SDBMHash unsigned int SDBMHash(char *str) { unsigned int hash = 0; while (*str) { // equivalent to: hash = 65599*hash + (*str++); hash = (*str++) + (hash << 6) + (hash << 16) - hash; } return (hash & 0x7FFFFFFF); } // RS Hash Function unsigned int RSHash(char *str) { unsigned int b = 378551; unsigned int a = 63689; unsigned int hash = 0; while (*str) { hash = hash * a + (*str++); a *= b; } return (hash & 0x7FFFFFFF); } // JS Hash Function unsigned int JSHash(char *str) { unsigned int hash = 1315423911; while (*str) { hash ^= ((hash << 5) + (*str++) + (hash >> 2)); } return (hash & 0x7FFFFFFF); } // P. J. Weinberger Hash Function unsigned int PJWHash(char *str) { unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8); unsigned int ThreeQuarters = (unsigned int)((BitsInUnignedInt * 3) / 4); unsigned int OneEighth = (unsigned int)(BitsInUnignedInt / 8); unsigned int HighBits = (unsigned int)(0xFFFFFFFF) << (BitsInUnignedInt - OneEighth); unsigned int hash = 0; unsigned int test = 0; while (*str) { hash = (hash << OneEighth) + (*str++); if ((test = hash & HighBits) != 0) { hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits)); } } return (hash & 0x7FFFFFFF); } // ELF Hash Function unsigned int ELFHash(char *str) { unsigned int hash = 0; unsigned int x = 0; while (*str) { hash = (hash << 4) + (*str++); if ((x = hash & 0xF0000000L) != 0) { hash ^= (x >> 24); hash &= ~x; } } return (hash & 0x7FFFFFFF); } // BKDR Hash Function unsigned int BKDRHash(char *str) { unsigned int seed = 131; // 31 131 1313 13131 131313 etc.. unsigned int hash = 0; while (*str) { hash = hash * seed + (*str++); } return (hash & 0x7FFFFFFF); } // DJB Hash Function unsigned int DJBHash(char *str) { unsigned int hash = 5381; while (*str) { hash += (hash << 5) + (*str++); } return (hash & 0x7FFFFFFF); } // AP Hash Function unsigned int APHash(char *str) { unsigned int hash = 0; int i; for (i=0; *str; i++) { if ((i & 1) == 0) { hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3)); } else { hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5))); } } return (hash & 0x7FFFFFFF); }
字符串压缩
#include <stdio.h> #include <string.h> int main () {\ //连续字符串压缩 //////////////////////////////////////// char str[20] = "aawwswwccsdddss"; char str1[20]; int num1[20] = {0}; int len; len = strlen(str);int i=0,index = 0; int sum = 0; char str_temp; while (i<len){ str_temp = str[i]; for(;i<len;i++){ if (str[i] == str_temp){ sum ++; } else{ str1[index]=str_temp; num1[index++] = sum; sum = 0; break; } } } //最后 str1[index]=str_temp; num1[index++] = sum; str1[index] = '\0'; /////////////////////////////////// i = 0; int len1 = strlen(str1); for(;i<len1;i++) printf("%c:%d\n",str1[i],num1[i]); return 0; }
十进制数转十六进制数
#include <stdio.h> #include <math.h> //十进制转为十六进制 #define bytesize 4 //十进制数字节大小 #define bitsize (bytesize*8) //十进制数bit位数 #define bit (bitsize/4) //十六进制位数 int main () { int x = 554; int i; int j; int temp; short byte[bit]; for(i=0;i<bit;i++){ temp = 0; for(j=0;j<bytesize;j++){ if(x & 1 << (i*bytesize+j)){ temp += pow(2,j); } } byte[i] = temp; } for(i=bit-1;i>=0;i--) { switch(byte[i]){ case 10: printf("A"); break; case 11: printf("B"); break; case 12: printf("C"); break; case 13: printf("D"); break; case 14: printf("E"); break; case 15: printf("F"); break; default: printf("%d",byte[i]); break; } } return 0; }
字符串替换
#include <stdio.h> #include <string.h> //被替换的字符串str1,需要替换成什么字符串str2,需要替换的字符c void replace(char str1[],char str2[],char c){ if(str1 == NULL || strlen(str1)==0) return; //遍历字符串中c的个数 int i=0; int lenstr1 = strlen(str1); //被替换字符串的长度 int lenstr2 = strlen(str2); //替换字符串的长度 short csize = 0; //需要替换字符的个数 for(;i<lenstr1;i++){ if(str1[i]==c) csize++; } //开辟内存 char strres[lenstr1+csize*lenstr2]; //替换 int strresindex=0; int j; for(i=0;i<lenstr1;i++){ if(str1[i]==c) { for(j=0;j<lenstr2;j++){ strres[strresindex+j] = str2[j]; } strresindex = strresindex + j; }else{ strres[strresindex] = str1[i]; strresindex++; } } printf("%s",strres); } int main () { char str1[] = "hello wor ld"; char str2[] = "acs"; char c = ' '; replace(str1,str2,c); return 0; }
字符串匹配
#include <stdio.h> #include <string.h> //BF暴力匹配字符串 //在一段字符串中匹配一段字符串,如果匹配到,返回下标 int main () { char str[18] = "li323243543"; char str1[4] = "3232"; int len,len1; len = strlen(str); len1 = strlen(str1); int flag = 1; //匹配标志 int startindex = 0; //字符串滑动下标 int tempstartindex = -1;//字符串下标 int index = 0; //匹配字符串下标 while (flag == 1) { startindex = tempstartindex++; //左移一位 for(;startindex<len;startindex++) { //字符串与匹配字符串某个字符匹配 if(str[startindex] == str1[index]) { index++; } //字符串与匹配字符串某个字符不匹配 else { index = 0; break; } //匹配字符串最后一个字符串匹配成功 //返回下标字符串 if(index==len1) { flag = 0; printf("%d\n",startindex-len1+1); break; } } } return 0; }
第一个只出现一次的字符
#include<stdio.h> #include<string.h> #define size 52 int main(void) { char str[] = "awdawssvrvdABAFDGD"; short a[size] = {0}; int i = 0; for(;i<strlen(str);i++){ if(str[i]>=97) a[str[i] - 'a'] +=1; if(str[i]<97&&str[i]>=65) a[str[i] - 'A'+26] +=1; } for(i=0;i<strlen(str);i++){ if(str[i]>=97) if(a[str[i] - 'a'] == 1){ printf("%c:%d\n",str[i],i); break; } if(str[i]<97&&str[i]>=65) if(a[str[i] - 'A'] == 1){ printf("%c:%d\n",str[i],i); break; } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2019-02-12 Shell学习之条件测试(四)
2019-02-12 Linux学习之RPM包管理-yum管理(十七)
2019-02-12 Shell学习之环境变量配置文件(三)
2019-02-12 Shell学习之Bash变量详解(二)