博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2014美团笔试之寻找最短子串
阅读量:6984 次
发布时间:2019-06-27

本文共 1334 字,大约阅读时间需要 4 分钟。

题目如图

实现代码

#include"iostream"#include"string"using namespace std;void Search(string &str,char p){	for(string::iterator it=str.begin();it!=str.end();it++)		if(*it==p)		  {str.erase(it);	        return;}//单个字符只会出现一次,此时可以返回}void FindShortText(string text,string key){	int Short=text.size()+1;	int Label=0;	for(int i=0;i<(text.size()-key.size());i++)	   {string temp(key);	    for(int j=0;j<=(text.size()-i-temp.size());j++)		{Search(temp,text[i+j]);		 if(temp.empty()&&(j+1)
>Text>>Key; FindShortText(Text,Key); return 0;}

程序分析

①使用完全遍历。遍历起点i,在i=[0 Text.size()-Key.size())遍历   ②对于每个起点,对应相同的字符串temp=Key。   ③从某个起点开始遍历后序字符,倘若字符在temp中出现,将该字符从temp中删除。   ④倘若temp为空,即某个起点到当前位置j的子字符串已经能够匹配所有的字符。循环终止。将当前字符长度与最短子字符串长度Short比较,取最小值并记录位置。   ⑤若最短子字符串长度为key的长度,没必要移动匹配起点,循环终止   ⑥初始化Short最短长度为text.size()+1.若结果未变,代表没有找到存在的子串。

要点注意

   ①string迭代器的使用。见Search函数

   ②成员函数basic_string::erasa

iterator erase(iterator first, iterator last)//删除[first last)范围内的元素,返回被删除的元素的前面的一个元素的迭代器类型or end() if no such element exists iterator erase(iterator it);//删除字符串中所有的 *it,返回被删除的元素的前面的一个元素的迭代器类型or end() if no such element exists basic_string& erase(size_type p0 = 0, size_type n = npos);//删除[0 n]的元素,并返回 当前string的引用.

   ③vector也有相同的使用。不过迭代器要声明类型:vector<int>::iterator it 

   ④string的输入可以用空格和换行表示读入结束。可以直接用cin,cout输入输出

转载于:https://www.cnblogs.com/engineerLF/p/5393117.html

你可能感兴趣的文章
hackerrank---Sets - Symmetric Difference
查看>>
服务器端与客户端TCP连接入门(三:多线程)
查看>>
第七课、Qt中的坐标系统------------------狄泰软件学院
查看>>
使用jmeter 设计流程发起测试
查看>>
说说猎豹安全浏览器
查看>>
POJ1269 直线相交
查看>>
颜色代码对应表
查看>>
SQL Server 数据库 'xxx' 正处于转换状态。请稍后再尝试该语句。
查看>>
装饰模式(Decorator)
查看>>
linux 下载rpm包到本地,createrepo:创建本地YUM源
查看>>
简繁转换
查看>>
什么是C++
查看>>
Power Designer的使用
查看>>
运行常用命令
查看>>
rdlc 分页操作和分页统计
查看>>
c# 不安全代码
查看>>
idea-crack
查看>>
[改善Java代码]break万万不可忘
查看>>
一个把List<String>转化为以","隔开的字符串的方法
查看>>
关于解决form表单记录上次保存填写记录清空
查看>>