微软的一道面试题:
如:abcbcbcabc,这个连续出现次数最多的字串是bc
一,考虑边界问题。
二,实现优化笛卡尔积组合,
总体我是这样想的:就是纵向切出字符串的连续组合集合,在横向一对一跳跃比较集合元素。
例如:abcbcabc<wbr><br>
一,纵向切:<br>
得到所有字符串组合,注意:这里要求的是最多连续子字符串,其实就是优化笛卡尔积的原则,也是边界。<br><wbr><span></span>字符串共8位,以子串的长度为1,从字符串第一位开始切,且称为切:<br>
1----从a开始切:(字符串为abcbcabc )<br>
第一次切出a子字符串,得到: a和bcbcabc,<br>
第二次切出ab子字符串,得到: ab和cbcabc,<br>
第三次切出abc子字符串,得到: abc和bcabc,<br>
第四次切出abcb子字符串,得到: abcb和cabc,<br>
第五次切出abcbc子字符串,得到: abcbc和abc,<br>
第六次切出abcbca子字符串,得到: abcbca和bc,<br>
第七次切出abcbcab子字符串,得到: abcbcab和c,<br>
第八次切出abcbcabc子字符串,得到: abcbcabc,<br>
得到a1集合数组(且为数组吧)<br>
元素为:a, ab, abc, ......<br><br>
2---再从b开始切::(字符串为abcbcabc )<br>
第一次切出b子字符串,得到: b和cbcabc,<br>
第二次切出bc子字符串,得到: bc和bcabc,<br>
第三次切出bcb子字符串,得到: bcb和cabc,<br>
第四次切出bcbc子字符串,得到: bcbc和abc,<br>
第五次切出bcbca子字符串,得到: bcbca和bc,<br>
第六次切出bcbcab子字符串,得到: bcbcab和c,<br>
第七次切出bcbcabc子字符串,得到: bcbcabc<br>
得到b2集合数组(且为数组吧)<br>
元素为:b, bc, bcb ,......<br><br>
3---再从c开始切: (字符串为abcbcabc )<br>
第一次切出c子字符串,得到: c和bcabc,<br>
第二次切出cb子字符串,得到: cb和cabc,<br>
第三次切出cbc子字符串,得到: cbc和abc,<br>
第四次切出cbca子字符串,得到: cbca和bc,<br>
第五次切出cbcab子字符串,得到: cbcab和c,<br>
第六次切出cbcabc子字符串,得到: cbcabc<br>
得到b3集合数组(且为数组吧)<br>
元素为:c, cb, cbc ,......<br><br>
4----再从b开始切: (字符串为abcbcabc )<br>
第一次切出b子字符串,得到: b和cabc,<br>
第二次切出bc子字符串,得到: bc和abc,<wbr><br>
第三次切出bca子字符串,得到: bca和bc,<br>
第四次切出bcab子字符串,得到: bcab和c,<br>
第五次切出bcabc子字符串,得到: bcabc<br>
得到b4集合数组(且为数组吧)<br>
元素为:b, bc, bca ,......<br><br>
5----再从c开始切: (字符串为abcbcabc )<br>
第一次切出c子字符串,得到: c和abc,<br>
第二次切出ca子字符串,得到: ca和bc,<wbr><br>
第三次切出cab子字符串,得到: cab和c,<br>
第四次切出cabc子字符串,得到: cabc<br>
得到c5集合数组(且为数组吧)<br>
元素为:c, ca, cab ,......<br><br>
6----再从a开始切: (字符串为abcbcabc )<br>
第一次切出a子字符串,得到: a和bc,<br>
第二次切出ab子字符串,得到: ab和c,<wbr><br>
第三次切出abc子字符串,得到: abc,<br>
得到a6集合数组(且为数组吧)<br>
元素为:a, ab, abc<wbr><br><br>
7----再从b开始切: (字符串为abcbcabc )<br>
第一次切出b子字符串,得到: b和c,<br>
第二次切出bc子字符串,得到: bc,<wbr><br>
得到b7集合数组(且为数组吧)<br>
元素为:b, bc<br><br>
8----再从c开始切: (字符串为abcbcabc )<br>
第一次切出c子字符串,得到: c<br><br>
得到c8集合数组(且为数组吧)<br>
元素为:c<br><br>
2,横向比:<br>
将a的所有切点按切的顺序保存到称为a1集合数组中(且为数组吧)<br>
将b的所有切点按切的顺序保存到称为b2集合数组中(且为数组吧)<br>
。。。依次类推到完。<br>
得到如下8个集合:(字符串为abcbcabc )<br>
行数/列数 1 2 3 4 5 6 7 8<br><wbr><span></span>1 a1: a, ab, abc, abcb, abcbc, abcbca , abcbcab, abcbcabc;<br><wbr><span></span>2 b2: b, bc, bcb , bcbc, bcbca, bcbcab, bcbcabc;<br><wbr><span></span>3 c3: c, cb, cbc , cbca, cbcab, cbcabc ;<br><wbr><span></span>4 b4: b, bc, bca , bcab, bcabc;<br><wbr><span></span>5 c5: c, ca, cab , cabc;<br><wbr><span></span>6 a6: a, ab, abc ;<br><wbr><span></span>7 b7: b, bc;<br><wbr><span></span>8 c8: c;<br>
将a1集合,b2集合。。。等全部集合横向比较:<br>
即将列1比较,列2比较跳跃1行比较,列3跳跃2行比较,列3跳跃3行比较。。。。到完;因为要求的是最多连续子字符串,所以要跳跃!<br>
得到相同字符串记数最大值,即求出出现次数最多的子串。<br>
比较方式:<br>
正于前面所说,要求的是最多连续子字符串。其实就是优化笛卡尔积的原则,也是边界。所以我们要做的是将所有集合一对一比较,不是多对多或其他(更简单的理由:位数不同,无需比较)。<br>
多位子字符串一对一比较时候,例如 ab属于a集合和b集合的bc比较,显然没有意义。需要跳跃比较(且这样说吧,呵呵)。跳跃是有规律的。很显然就不说了。<br>
之所以纵切,是为了解决横比较带来的优化问题</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
pair<int,string> fun(const string &str)
{
vector<string> substrs;
int maxcount=1,count =1;
string substr;
int i,len = str.length();
for(i =0;i<len;++i)
{
substrs.push_back(str.substr(i,len-i));// // 把abcbcbcabc,bcbcbcabc,cbcbcabc, bcbcabc,cbcabc,bcabc,cabc,abc,bc,c一次放入容器中
}
for(i =0;i<len;i++)
{
for(int j =i+1;j<len;j++)
{
count =1;
if(substrs[i].substr(0,j-i)==substrs[j].substr(0,j-i))//第一次循环先单个字符比较,然后再两个,三个字符比较
{
++count;
for(int k =j+(j-i);k<len;k +=j-i)
{
if(substrs[i].substr(0,j-i)==substrs[k].substr(0,j-i))//如果前面比较成功,则需要后面跳跃处理
++count;
else
break;
}
if(count>maxcount)
{
maxcount =count;
substr =substrs[j].substr(0,j-i);
}
}
}
}
return make_pair(maxcount,substr);
}
int main()
{
string str;
pair<int, string>rs;
while(cin>>str)
{
rs=fun(str);
cout<<rs.second<<rs.first<<'\n';
}
return 0;
}
求一个字符串中连续出现次数最多的子串,例如:abcbcbcabc, 这个串中连续出出次数最多的子串是bc, 它出现了3次。
以下是我的实现代码,用c语言实现,已经编译通过。
#include "stdio.h"
#include "string.h"
int count = 0;
char sub_str[256];
void find_str(char *str)
{
int str_len = strlen(str);
int i, j, k;
int tmp_cnt = 0;
for (i = 0; i < str_len; i++)
{
for (j = i+1; j < str_len; j++)
{
int n = j-i; //sub string length
tmp_cnt = 1;
if (strncmp(&str[i], &str[j], n) == 0) //compare n-lengths strings
{
tmp_cnt++; //they are equal, so add count
for (k = j+n; k < str_len; k += n) //consecutive checking
{
if (strncmp(&str[i], &str[k], n) == 0)
{
tmp_cnt++;
}
else
break;
}
if (count < tmp_cnt)
{
count = tmp_cnt;
memcpy(sub_str, &str[i], n); //record the sub string
}
}
}
}
}
int main()
{
char *str = "abcbcbcabc";
find_str(str);
printf("%d, %s\n", count, sub_str);
return 0;
}
分享到:
相关推荐
- 找出字符串中所有子串是回文的次数:遍历所有子串并检查是否为回文。 - 找出列表中出现的所有连续数字:需要找出连续的数字序列。 - 找出一个字符串中子串,不重复:可能需要使用哈希表或集合来去重。 这些面试题...
- **找出数组中两个只出现一次的数字**:可以使用异或操作来找出这两个数字。 - **找出两个链表的第一个公共结点**:通过双指针的方法来寻找公共结点。 - **在字符串中删除特定的字符**:可以使用双指针法,一个指针...
给定一个包含一百万个数字的字符串,要求找出所有重复出现的连续三位数字及其重复次数。要实现这样的功能,一个线性时间复杂度O(n)的算法是必要的,其中n是字符串的长度。这个问题不能在常数时间O(1)内解决,因为...
5. **最长回文子串**:找出字符串中最长的回文子串,Manacher's Algorithm是解决此问题的一个高效方法。 6. **字符串的全排列**:计算字符串的所有字符排列组合,可以使用回溯法或者DFS(深度优先搜索)。 ### 第二...
4. 如何找出数组中出现奇数次的数 5. 如何找出数组中第 k 小的数 6. 如何求数组中两个元素的最小距离 7. 如何求解最小三元组距离 8. 如何求数组中绝对值最小的数 9. 如何求数组连续最大和 字符串篇 1. 如何求一个...
文件中提到了一个有趣的字符串处理问题,要求找出最长的连续重复子串。例如,对于字符串"ababc",最长连续重复子串是"ab"。这类问题通常可以通过动态规划或滑动窗口等算法来解决,关键在于理解和运用算法原理,识别...
- **详细解释**: 给定一个字符串,如"ababc",任务是找出该字符串中最长连续重复子串。在这个例子中,"ab"是连续重复出现且最长的子串。 - **解决方案**: 可以遍历字符串并检查每个子串是否连续重复出现,同时记录...
- **找出数组中重复的数字**:可以使用哈希表或计数数组记录每个数字出现的次数,第一次遇到计数大于1的数字就是重复的。 - **有序数组中绝对值最小的重复数字**:可以通过比较相邻元素的绝对值大小来确定。 在...
对于给定的字符串S和整数L,找到字符串S中所有长度为L且不包含重复字符的子串。 **解决方案**: - **算法思想**:采用滑动窗口(Sliding Window)技术来高效解决问题。通过定义左、右两个指针来扫描字符串,并利用...
删除字符串中出现次数最少的字符需要统计字符频率,HJ33.整数与IP地址间的转换涉及数字与字符串的相互转换,HJ101.输入整型数组和排序标识需要处理数组和字符串结合的问题。 3. **排序**:排序题目包括HJ8.合并表...
在内容中提到的滑动窗口问题,例如“Combination Sum II”和“Sliding Window + Count Map”,涉及到在连续的数据结构中寻找满足特定条件的最长或最短子串的问题。这些技术要求编写者精通如何使用哈希表来快速追踪...
10. **First Unique Character in a String** (Easy): 找出字符串中第一个不重复的字符。使用哈希表可以简化问题。 11. **Longest Substring Without Repeating Characters** (Medium): 找出无重复字符的最长子串。...
Bigram 分词:找出文本中所有长度为2的单词组合。 - 1337. 方阵中战斗力最弱的 K 行:找到矩阵中战斗力最弱的 K 行。 - 811. 子域名访问计数:统计不同子域名的访问次数。 - 485. 最大连续1的个数:在二进制数组...
- Longest Palindromic Substring: 要求找出字符串中的最长回文子串。这通常可以通过中心扩展法或动态规划来解决。 - ZigZag Conversion: 将字符串从左到右依次在Z字形排列填充到指定的行数。需要找出转换后的字符串...
例如,在字符串中查找具有特定长度且所有字符都不同的子串,或者在数组中查找和为给定值的最小子数组。 滑动窗口有以下关键组成部分: 1. **窗口大小**:预先设定的窗口包含的元素数量。 2. **窗口起始位置**:窗口...
- **问题描述**:找出字符串的最长前缀,该前缀也是其逆序字符串的子串。 - **解决方案**: - 将原字符串与其逆序字符串拼接起来。 - 使用KMP算法找到最长的相同前缀。 - KMP算法能够高效地匹配字符串中的模式。 ...
1.5.3. 在字符串中找出连续最长的数字串 ....................................................109 1.5.4. 链表操作..............................................................................................
例如,"滑动窗口最大值"(Sliding Window Maximum)需要找出数组中每个指定宽度窗口的最大值。 5. **哈希表**:哈希表提供了快速查找功能,常见于解决查找、计数、去重等问题。"两数之和"(Two Sum)也可以用哈希表...
7. **滑动窗口**:滑动窗口在处理数组或字符串问题时非常有用,例如找到数组中最大的连续子数组和,或者找出字符串中最长的无重复字符子串。 8. **哈希表**:哈希表提供快速的查找和插入操作,常用于解决查找、去重...