【算法】字符串左移函数的O(n)解法

例如,字符串 abcdef ,若要让def翻转到abc的前头,只要按照下述3个步骤操作即可:

  1. 首先将原字符串分为两个部分,即X:abc,Y:def;
  2. 将X反转,X->X^T,即得:abc->cba;将Y反转,Y->Y^T,即得:def->fed。
  3. 反转上述步骤得到的结果字符串X^TY^T,即反转字符串cbafed的两部分(cba和fed)给予反转,cbafed得到defabc,形式化表示为(X^TY^T)^T=YX,这就实现了整个反转。 

这就是把字符串分为两个部分,先各自反转再整体反转的方法,时间复杂度为O(n),空间复杂度为O(1),达到了题目的要求。

代码:

#include <STDIO.H>

void reverse(char *str,int l,int r)    //对字符串的l-r实现翻转
{
	while(l<r)
	{
		char temp=str[l];
		str[l++]=str[r];
		str[r--]=temp;
	}
}

void LeftRotateString(char *str,int r,int x)   //三段翻转
{
	x%=r;
	reverse(str,0,x-1);           //因为下标是从0开始,所以是x-1;
	reverse(str,x,r);
	reverse(str,0,r);
}

int main()
{
	char ar[]="abcdefg";
	LeftRotateString(ar,6,1);
	puts(ar);
	return 0;
}

时间: 2024-08-27 17:41:05

【算法】字符串左移函数的O(n)解法的相关文章

[算法]字符串左移k位

如,abcde左移3位为deabc 要求时间复杂度O(n),空间复杂度O(1),每一个字符只能遍历一次 摘自http://blog.csdn.net/geniusluzh/article/details/8460031 利用数学解决该问题 其实对于这道题,最初一看的想法就是将当前位依次替换左移m位对应的那个位,然后依次替换.后来发现有的情况一次循环替换就能全部完成整个串的左移,而有的情况下会出现多个循环链,一时只得到规律,不能想到很好的证明办法,只怪以前初等数论没有好好学啊! 我们发现对于长度为

数据结构——算法之(012)( linux C 所有字符串操作函数实现)

题目:实现linux C下常用的字符串操作函数 题目分析: 一.面试中可能经常遇到这样的问题:比如strcpy.memcpy.strstr 二.参考了linux 内核代码,对linux大神表示感谢,代码写得相当精致,这里拿来与大家分享吧 算法实现: /* * linux/lib/string.c * * Copyright (C) 1991, 1992 Linus Torvalds */ /* * stupid library routines.. The optimized versions

几个常见字符串处理函数的实现原理

字符串是一种常见的数据结构,对字符串的处理又可以十分灵活,所以在实际开发,尤其是非数值处理中,字符串的应用非常广泛.虽然很多字符串操作都封装在了函数库里,应用程序可以直接通过调用库函数来实现字符串处理,然而对于开发者而言,若能了解其底层实现原理,对于应用编程而言还是大有裨益的. 这篇文章主要介绍几种常用的字符串处理函数的实现原理. 一.strlen函数 strlen函数:计算字符串的实际长度,不包括'\0'. 算法:从第一个字符开始扫描,直到遇见第一个'\0',停止扫描,返回字符串长度. 代码如

PHP内置的字符串处理函数

字符串的特点    1.其他类型的数据用在字符串类型处理函数中,会自动将其转化成字符串后,在处理 <?php echo substr("abcdefghijklmn",2,4),"<br>"; //cdef //使用数字会自动转化为字符串 echo substr(123456,2,4); //3456 ?> 2.可以将字符串视为数组,当做字符集合来看待 <?php $str="abcdefg"; //下面这两种方法都

php常用字符串处理函数

PHP 字符串函数是 PHP 核心的组成部分.无需安装即可使用这些函数. 常用的字符串处理函数: str_replace():替换字符串中的一些字符(对大小写敏感). str_repeat():把字符串重复指定的次数. strlen():返回字符串的长度. stripos():返回字符串在另一字符串中第一次出现的位置(对大小写不敏感). str_split():把字符串分割到数组中. trim():移除字符串两侧的空白字符和其他字符. ltrim():移除字符串左侧的空白字符或其他字符. rtr

php字符串处理函数大全

php字符串处理函数大全 addcslashes - 为字符串里面的部分字符添加反斜线转义字符addslashes - 用指定的方式对字符串里面的字符进行转义bin2hex - 将二进制数据转换成十六进制表示chop - rtrim() 的别名函数chr - 返回一个字符的ASCII码chunk_split - 按一定的字符长度将字符串分割成小块convert_cyr_string - 将斯拉夫语字符转换为别的字符convert_uudecode - 解密一个字符串convert_uuencod

String字符串处理函数

开发习惯常用字符串处理函数梳理:strtr() 转换字符串中特定的字符.substr() 返回字符串的一部分.strstr() 搜索字符串在另一字符串中的首次出现(对大小写敏感)str_replace() 替换字符串中的一些字符.(对大小写敏感)strcmp() 比较两个字符串.(对大小写敏感)strlen() 返回字符串的长度.substr_count() 计算子串在字符串中出现的次数.substr_replace() 把字符串的一部分替换为另一个字符串 implode() 把数组元素组合为一

c++ 常用字符串处理函数

字符串是目前处理是目前工程项目中出现最多的问题,尤其是自然语言处理,文本处理和分析等等,c++目前只提供比较简单的字符串处理函数,不像Python,Java对字符串操作功能强大,下面是自己封装的几个常用字符处理的函数,其实功能实现应该有很多种,但是由于字符串处理是基础函数,需要适当的考虑算法实现的性能.下面是自己实现的一些功能,性能感觉还不错. /********************************************* function: string common funct

PHP中常用的字符串格式化函数总结

注意:在PHP中提供的字符串函数处理的字符串,大部分都不是在原字符串上修改,而是返回一个格式化后的新字符串. 一.取出空格和字符串填补函数 空格也是一个有效的字符,在字符串中也会占据一个位置.用户在表单输入数据时,经常在无意中会多输入一些无意义的空格.因此PHP脚本在接收到通过表单处理过来的数据时,首先处理的就是字符串中多余的空格,或者其他一些没有意义的符号.在PHP中可以通过ltrim().rtrim()和trim()函数来完成这项工作.这三个函数的语法格式相同,但作用有所不同.他们的语法格式