【基础数据结构】字符串

发布时间:2024年01月14日

一、字符串输入

1.scanf("%s",str);分隔符为空格、制表符、回车

2.fgets(str,10,stdin);10为字符串char str[10]长度,可以读取空格字符的字符串,10代表最大读取长度,最多读取9个字符,这个函数自动在读取到换行符停止,删除\n才能正确输出

str[strlen(str)-1]='\0';

printf("%s\n",str);

二、字符串输出

1.printf("%s\n",str);

2.puts(str);自动在末尾加上\n,不支持格式化输出

三、字符数组

char arr[size];

arr[0]='H';

arr[1]='e';

arr[2]='l';

arr[3]='l';

arr[4]='o';

arr[5]='\0';

四、字符串

char str[]="Hello,world!";

str[0]='h';

char str[]={'H','e','l','l','o','!','\0'};

char arr[13]="Hello,world!";

char *str=arr;

五、标准库函数

strlen(str);获取字符串长度

strcmp(str1,str2);比较两个字符串是否相等

strcpy(dest,src);将源字符串复制到目标字符串中

strcat(dest,src);将源字符串加入到目标字符串末尾

六、例题

例题1

最长特殊序列 Ⅰ

给你两个字符串?a?和?b,请返回?这两个字符串中?最长的特殊序列??的长度。如果不存在,则返回?-1?。

「最长特殊序列」?定义如下:该序列为?某字符串独有的最长子序列(即不能是其他字符串的子序列)?。

字符串?s?的子序列是在从?s?中删除任意数量的字符后可以获得的字符串。

  • 例如,"abc"?是?"aebdc"?的子序列,因为删除?"aebdc"?中斜体加粗的字符可以得到?"abc"?。?"aebdc"?的子序列还包括?"aebdc"?、?"aeb"?和?""?(空字符串)。

示例 1:

输入: a = "aba", b = "cdc"
输出: 3
解释: 最长特殊序列可为 "aba" (或 "cdc"),两者均为自身的子序列且不是对方的子序列。

示例 2:

输入:a = "aaa", b = "bbb"
输出:3
解释: 最长特殊序列是 "aaa" 和 "bbb" 。

示例 3:

输入:a = "aaa", b = "aaa"
输出:-1
解释: 字符串 a 的每个子序列也是字符串 b 的每个子序列。同样,字符串 b 的每个子序列也是字符串 a 的子序列。

提示:

  • 1 <= a.length, b.length <= 100
  • a?和?b?由小写英文字母组成

要解决这个问题,我们需要理解什么是特殊序列。

根据题目的定义,最长特殊序列是某个字符串独有的最长子序列,即不能是其他字符串的子序列。

我们可以按照以下思路来解决这个问题:

  1. 如果字符串 a 和字符串 b 相等,那么它们没有特殊序列,返回 -1。
  2. 否则,返回两个字符串长度的较大值,因为每个字符串本身就是它们自己的特殊序列,而不可能是对方的子序列。

在上述代码中,我们定义了一个函数 `findLUSlength` 来计算最长特殊序列的长度。在 `main` 函数中,我们给出了示例输入,然后调用 `findLUSlength` 函数来计算最长特殊序列的长度,并输出结果。

#include <stdio.h>
#include <string.h>

int findLUSlength(char *a, char *b) {
    int lenA = strlen(a);
    int lenB = strlen(b);
    
    if (strcmp(a, b) == 0) {
        return -1;
    }
    
    return lenA > lenB ? lenA : lenB;
}

int main() {
    char a[] = "aba";
    char b[] = "cdc";
    
    int result = findLUSlength(a, b);
    
    printf("最长特殊序列的长度为:%d\n", result);
    
    return 0;
}

例题2

URL化

URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)

示例 1:

输入:"Mr John Smith    ", 13
输出:"Mr%20John%20Smith"

示例 2:

输入:"               ", 5
输出:"%20%20%20%20%20"

提示:

  • 字符串长度在 [0, 500000] 范围内。

?解法1:自己写的,但是超时了

#include <stdio.h>
#include <string.h>
char* replaceSpaces(char* S, int length) {
	int i = 0;
    for (i = 0; i < length; i++) {
        if (S[i] == ' ') {
            S[i] = '%';          
            int j=0;
            for(j=length-1;j>i;j--)
            {
            	S[j+2]=S[j];
			}	
			S[i+1] = '2';
            S[i+2] = '0';
            i += 2;  // 跳过已替换的字符
            length += 2;
            S[length]='\0';
        }
    }
    return S;
}

int main() {
    char str[50000];
    fgets(str, sizeof(str), stdin);
    str[strlen(str) - 1] = '\0';
    printf("%s\n", replaceSpaces(str, strlen(str)));
    return 0;
}

解法2:未超时

#include <stdio.h>
#include <string.h>

char* replaceSpaces(char* S, int length) {
    int spaceCount = 0;
    int i=0;
    for (i = 0; i < length; i++) {
        if (S[i] == ' ') {
            spaceCount++;
        }
    }
    
    int newLength = length + 2 * spaceCount;
    int newIndex = newLength - 1;
    for (i = length - 1; i >= 0; i--) {
        if (S[i] == ' ') {
            S[newIndex] = '0';
            S[newIndex - 1] = '2';
            S[newIndex - 2] = '%';
            newIndex -= 3;
        } else {
            S[newIndex] = S[i];
            newIndex--;
        }
    }
    S[newLength]='\0';
    return S;
}

int main() {
    char str[50000];
    fgets(str, sizeof(str), stdin);
    str[strlen(str) - 1] = '\0';
    printf("%s\n", replaceSpaces(str, strlen(str)));
    return 0;
}

例题3

判断国际象棋棋盘中一个格子的颜色

给你一个坐标?coordinates?,它是一个字符串,表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。

如果所给格子的颜色是白色,请你返回?true,如果是黑色,请返回?false?。

给定坐标一定代表国际象棋棋盘上一个存在的格子。坐标第一个字符是字母,第二个字符是数字。

示例 1:

输入:coordinates = "a1"
输出:false
解释:如上图棋盘所示,"a1" 坐标的格子是黑色的,所以返回 false 。

示例 2:

输入:coordinates = "h3"
输出:true
解释:如上图棋盘所示,"h3" 坐标的格子是白色的,所以返回 true 。

示例 3:

输入:coordinates = "c7"
输出:false

提示:

  • coordinates.length == 2
  • 'a' <= coordinates[0] <= 'h'
  • '1' <= coordinates[1] <= '8'
#include <stdio.h>
#include <string.h>
#include <stdbool.h>  

bool squareIsWhite(char* coordinates) {
    if (coordinates[0] == 'a' || coordinates[0] == 'c' || coordinates[0] == 'e' || coordinates[0] == 'g') {
        int num = coordinates[1] - '0';
        if (num % 2 == 0) {
            return true;
        } else {
            return false;
        }
    } else if (coordinates[0] == 'b' || coordinates[0] == 'd' || coordinates[0] == 'f' || coordinates[0] == 'h') {
        int num = coordinates[1] - '0';
        if (num % 2 == 0) {
            return false;
        } else {
            return true;
        }
    } else {
        return false;
    }
}

int main() {
    char str[3];
    scanf("%2s", str);
    str[2] = '\0';
    
    if (squareIsWhite(str)) {
        printf("true\n");
    } else {
        printf("false\n");
    }
    
    return 0;
}
文章来源:https://blog.csdn.net/qq_62704693/article/details/135582978
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。