深度挖掘字符串算法和句子逆置算法

文章详细介绍了两种不同的字符串逆置方法,包括使用循环和递归,以及三种句子逆置的算法,包括先逆置句子再逆置单词,先逆置单词再逆置句子,以及使用二维数组的方法。这些算法展示了对字符串操作的技巧和思考过程。
摘要由CSDN通过智能技术生成

CSDN作者panzii666
我这次对句子算法的理解希望对大家有所帮助。比较烧脑,大家多多支持我,谢谢!

标题一 逆置字符串算法

1.方法一

void reverse_string(char arr[])
{
	char* left = arr;
	char* right = arr + strlen(arr) - 1;


	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;


		left++;
		right--;
	}
}
  int main()
  {
	  char arr[] = "I like beijing.";
	    reverse_string(arr);
  	      printf("%s",arr);
  	      return 0;
  }

逆置字符串,循环的方式实现非常简单

  1. 给两个指针,left放在字符串左侧,right放在最后一个有效字符位置
  2. 交换两个指针位置上的字符
  3. left指针往后走,right指针往前走,只要两个指针没有相遇,继续2,两个指针相遇后,逆置结束
    在这里插入图片描述

2.方法二 递归
对于字符串“abcdefg”,递归实现的大概原理:

  1. 交换a和g,
  2. 以递归的方式逆置源字符串的剩余部分,剩余部分可以看成一个有效的字符串,再以类似的方式逆置
void reverse_string(char* arr)
{
	int len = strlen(arr);
	char tmp = *arr;
	*arr = *(arr+len-1);
 
	*(arr+len-1) = '\0';
	if(strlen(arr+1)>=2)
		reverse_string(arr+1);
 
	*(arr+len-1) = tmp;
}
int main()
{
         char arr[] = "I like beijing.";
	    reverse_string(arr);
		printf("%s", arr);
		return 0;
		}```	   
	

```c
在这里插入代码片

标题二 句子的逆置算法

算法一
1.先逆置整个句子。
2.再逆置每个单词。

#include<stdio.h>
#include<string,h>
void reverse(char* source, char* over)
{
	char temp = 0;
	while (source <= over)
	{
		temp = *source;
		*source = *over;
		*over = temp;
		source++;
		over--;
	}
}
int main()
{
	char arr[] = "I like beijing.";
	int len =strlen(arr);
	char* start = arr;
	char* dest = arr;
	while (*dest)
	{

		while (*dest != ' ' && *dest != '\0')
		{
			dest++;
		}
		reverse(start, dest - 1);
		if (*dest == ' ')
		{
			dest++;

		}
		start = dest;
	}
	start = arr;
	reverse(start, dest - 1);
	printf("%s", arr);
        return 0;

}

算法二
1.先逆置每个单词。
2.再逆置整个句子。

#include<stdio.h>
#include<string.h>
void reverse(char* start, char* dest)
{

	int temp = 0;
	while (start < dest)
	{
		temp = *start;
		*start = *dest;
		*dest = temp;
		start++;
		dest--;
	}
}
int main()
{
	char arr[] = "I like beijing.";
	int len = strlen(arr);
	reverse(arr, arr + len - 1);
	char* source = arr;
	char* over = arr;
	while (*over)
	{
		while (*over != ' ' && *over != '\0')
		{
			over++;
		}
		reverse(source, over - 1);
		source = over + 1;
		if (*over == ' ')
			over++;
	}
	printf("%s", arr);
	return 0;
}

算法三
1.定义两个二维数组。
2.在放有字符串的数组中从后往前找每个单词。
3.把每个单词找完就拷贝到另一个数组中。
从后往前找的好处就是不用再逆置整个句子了。

 #include<stdio.h>
#include<string.h>
int main()
{
    char str1[] = "I like beijing.";
    char str2[100] = { 0 };
    int len = strlen(str1);
    char* start = str1 + len - 1;
    char* dest = str1 + len - 1;
    while (start!=str1)
    {
        while (*dest != ' ')
        {
            dest--;
            if (dest == str1)
            {
                break;
            }
        }
        while (*dest == ' ')
        {
            strcat(str2, dest);
            *dest = '\0';
        }
        if (dest == str1)
        {
            *(dest+1) = '\0';
            strcat(str2, dest);
         }
           start = dest;

    }
      printf("%s", str2);
      return 0;
}

希望各位大哥大姐觉得对自己由用处的就麻烦关注一下下,谢谢哈!
这些算法我想了很多次,并且很烧脑,大家支持一下,谢谢!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值