咖啡


私信TA

用户名:Tianxn

访问量:138286

签 名:

十年OI一场空,不开LL见祖宗。

等  级
排  名 10
经  验 27320
参赛次数 10
文章发表 197
年  龄 22
在职情况 学生
学  校 西安电子科技大学
专  业 软件工程

  自我简介:

解题思路:

解题思路:

特定函数解析:

对于这道题;我最开始用暴力枚举,并且循环层次搞的有点混乱,最后一头雾水,我用java写了出来,因为Java里面有个一个取字串的函数string.substring(); 突然就想到C++的string类是否有同样功能的函数;查阅了一下,确实有一个这样的函数:substr() 

            string  substr(start, lenght)

                    功能:返回一个从指定位置开始的指定长度的子字符串

                    参数start:必选项。为所需字串的开始位置。

                    参数lenght:可选项。在返回的子字符串中应包括的字符个数。

                    说明:如果lenght为0或者负数,将返回一个空字符串。如果没有指定lenght,则子字符串将延续到主字符串的最后。

(整个题就用这个函数解决,然后说说思路)


题意解析:

       题中说,从给定的字符串中,选出长度大于等于L的子字符串,并且打印出出现次数最多的子串,如果出现次数相同,则打印最长的子串,如果出现次数相同且字串长度相等,则打印最早出现的字串。


思路:

        很多人想着循环嵌套,但是我们要处理好层次关系:首先,最外次循环应该是(题:大于等于L)子串的长度,即L到len(串的长度),这样即每次处理同样长度的串,并统计该串的相关数据,然后再处理L+1,L+2,……一直到串自身;次层循环应该是要处理的串(提取的长度为L的字串),次次层循环是再整个串中找和次层循环中找出来的字串相等的串,并统计个数;大概思路就是这样。

        有几点细节:

                1.怎能找最长的子串:首先这个长子串的个数要是最多(或者和比它短的串的个数相等),通过比较长度即可;

                2.怎样找出现最早的相同长度的子串:用一个计数器来记录某个长度子串出现的次数,通过判断每一次的次数是否大于上次一次的次数即可(注意,我说的是大于)


注意事项:


                计数器置零的位置;和一个保存最长子串的中间变量;


        我也准备用C语言写一下这个题,用到一个strncmp()这个函数,有兴趣的可以先了解一下这个函数。

参考代码:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <functional>
using namespace std;
int main()
{
	int L, len, maxn=0;
	string s, t;
	while(cin >> L >> s)
	{
		len = s.length();
		for(int i = L; i <= len; ++i)
		{
			for(int j = 0; i+j <= len; ++j)
			{
				string s1 = s.substr(j, i);
				int cnt = 0;
				for(int k = j; k+i <= len; ++k)
				{
					string s2 = s.substr(k, i);
					if(s1 == s2)
					{
						cnt++;
					}
				}
				if(cnt >= maxn)
				{
					if(cnt > maxn)
					{
						t = s1;
						maxn = cnt;
					}
					else
					{
						if(s1.length() > t.length())
						{
							t = s1;
						}
					}
				}
			}
		}
		cout << t << endl;
	}
	return 0;
}


 

0.0分

3 人评分

  评论区

#include<iostream>
using namespace std;
int main()
{
	int L;
	string S;
	cin >> L;
	if (L < 1)
		return 0;
	cin >> S;
	int max_s = 0, counts = 0;//串长,最多次数,次数
	string word;//串

	for (int i = 1; i != L + 1; ++i)//截取几个字符
	{
		for (int j = 0; j + i != S.size(); ++j)//字符从第几个开始截取
		{
			string s(S, j, i);//把S从下标第j个开始拷贝i个字符串个s
			for (int k = j; k + i != S.size(); ++k)//和s进行比对
			{
				string w(S, k, i);//s和w进行比对
				if (s == w)//如果相等
					counts++;//次数自加
			}
			if ((s.size() > word.size() && counts > 1)
				|| counts > max_s)
				word = s, max_s = counts;

			counts = 0;
		}
	}
	cout << word;
	retu
2020-03-12 13:01:33
  • «
  • 1
  • »