题目
输入一个字符串,输出该字符串中对称的子字符串的最大长度。
比如输入字符串"google",由于该字符串里最长的对称子字符串是"goog",因此输出4。
思想
首先想到的是采用穷举的方法来分析该问题. 即从最大的对称串开始判断,如果不是,减小一,再找存在不存在对应长度的字符串,依次直到找到对称串长度,返回。
上述方法有点像暴力破解。且没有利用以前的结果。
先设置最大对称串长度max为1,然后找长度是2或者3的对称串,然后对其扩展,直到找到最大对称串,如果最大比max大,将值赋给max。
代码
public class FindMaxSymmetryString {
public static void main(String[] args) {
char[] string = "abcabccbaa".toCharArray();
System.out.println(findMaxSymmetryString2(string));
}
/**
* 方法2
* @param string
* @return
*/
public static int findMaxSymmetryString2(char[] string) {
int length = string.length;
int max = 1;
// 寻找长度为2的偶数最大对称串
for (int i = 0; i < length - 1; i++) {
if (string[i] == string[i + 1]) {
int temp = expandSymetry(string, i, i + 1);
if(temp>max) {
max= temp;
}
}
}
//寻找长度为3以上的奇数最大对称串
for(int i=0;i<length-2;i++) {
if(string[i] == string[i+2]) {
int temp = expandSymetry(string, i, i+2);
if(temp>max) {
max= temp;
}
}
}
return max ;
}
private static int expandSymetry(char[] string, int i, int j) {
int max = j-i+1;
int length = string.length;
int m = 1;
for(; j+m<length && i-m>=0;m++) {
if(string[j+m]!=string[i-m]) {
break;
}
}
return max+2*(m-1);
}
/**
* 方法1
* 从最大对称串开始进行匹配,直到找到最大匹配串
* @param string
* @return
*/
public static int findMaxSymmetryString(char[] string) {
int length = string.length;
for (int i = length; i >= 2; i--) {
for (int j = 0; j + i - 1 < length; j++) {
if (isSymmetry(string, j, j + i - 1)) {
return i;
}
}
}
return 1;
}
private static boolean isSymmetry(char[] string, int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
if (string[i] != string[j]) {
return false;
}
}
return true;
}
}
你有什么简单的方法吗?Share一下吧。。
分享到:
相关推荐
解题方法是通过遍历字符串,对于每个字符,如果它不是数字字符,则将其复制到新的字符串中,最后在新字符串的末尾添加一个空字符('\0'),表示字符串的结束。 具体实现上,定义了一个delnum函数,该函数接受一个字符...
5. 字符串长度:strlen()函数计算字符串的长度,但不包括结束的空字符'\0'。 6. 字符串格式化:学习使用printf()和scanf()函数处理字符串输入和输出,以及如何使用sprintf()和sscanf()在内存中操作字符串。 7. ...
题目要求编写一个程序,该程序能够读取一个长度不超过50个字符的字符串,并统计其中的数字、字母和空格的数量。这涉及到字符串处理的基础知识,包括字符类型的识别和计数。 #### 解题思路与算法分析 1. **输入**:...
1. **字符串循环左移**:给定一个字符串和一个整数k,将字符串中的每个字符向左移动k个位置。例如,字符串"abcdefg",k=2,移动后的结果为"efgabcd"。可以使用双指针技巧,将字符串分为两部分,然后交换它们。 2. *...
在给定的问题中,我们面临着一个字符串处理任务,目标是找到一个给定字符串中的最长美好子字符串。美好字符串是指在该字符串中,每个出现的字符(大写或小写)都有其对应的大写或小写形式同时存在。例如,"abABB" ...
4. **字符串处理函数**:C语言中的`strlen()`用于获取字符串长度,`strcpy()`和`strncpy()`用于复制字符串,`strcat()`和`strncat()`用于连接字符串,`strchr()`和`strstr()`用于查找子字符串,这些函数可以辅助我们...
在C++编程语言中,字符串处理是至关重要的一个部分,特别是在参加像“蓝桥杯”这样的编程竞赛中。本文将详细探讨C++中的字符串输入输出函数,帮助参赛者更好地理解和运用这些工具,以解决竞赛中遇到的问题。 1. **...
本题目的核心是输出一个给定字符串的所有子串,这里我们以字符串 "abc" 为例来详细讲解解题思路和方法。 首先,我们需要理解子字符串的概念。在字符串 "abc" 中,它的每一个字符(如 "a", "b", "c")以及由连续字符...
Rabin-Karp算法特别适用于字符串长度较短且字符种类有限的情况。在Java中,HashMap是一个重要的数据结构,它实现了基于哈希表的映射机制,提供了诸如put、get、containsKey等操作。 接着,让我们看一下KMP算法。KMP...
根据给定的文件信息,本篇文章将详细解析“给定一个字符串,求出其最长的重复子串”这一算法问题。此题目源自于腾讯2011年10月15日的校园招聘笔试,主要考察应试者对字符串处理、排序及模式匹配等算法的理解与应用...
任务是在这个环形字符串中找到一个子字符串,要求该子字符串中字符`o`出现的次数为偶数,并且该子字符串尽可能长。最终输出这个最长子字符串的长度。 **输入描述**: - 输入是一个小写字母组成的字符串`s`。 - 字符...
虽然简单,但效率较低,时间复杂度为O(n*m),n为主字符串长度,m为模式字符串长度。 2. **KMP算法**(Knuth-Morris-Pratt):通过预处理模式字符串构建失配表,避免不必要的回溯,提高了效率。时间复杂度仍为O(n)。...
6. 如果字符串长度相同,只在一个位置上不同,那么它们不是亲密字符串。 7. 如果字符串长度相同,且所有位置上的字符都相同,但没有重复的字符,那么它们不是亲密字符串。如果存在重复的字符,可以通过交换这些重复...
标题中的“整理字符串1”指的是一个编程问题,目标是整理给定的字符串使其符合特定的规则。描述中进一步解释了这个规则:相邻的字符 s[i] 和 s[i+1] 必须不满足以下两个条件之一:如果 s[i] 是小写字母,则 s[i+1] ...
编写一个程序,该程序接收一个字符串作为输入,并将字符串中所有的小写字母转换为大写字母。例如,如果输入的字符串是 "hello world",则输出应为 "HELLO WORLD"。 #### 输入 一个字符串,长度不超过200个字符。 ...
- **解析**: 设计一个两位数加法测验程序,要求能够记录用户的答题情况,并统计答对和答错的题目数量。涉及到循环结构的设计以及基本的错误处理机制。 **E31. 循环嵌套、穷举法** - **知识点**: 穷举法、循环结构。...
倍增算法利用了后缀数组的一些性质,通过逐步增加比较长度来构建,其时间复杂度可以达到O(n log^2 n),n为字符串长度。而DC3(Doubly-Comparing Three Characters)算法则是基于字符的字典序,通过三字符的比较来...
这个类提供了丰富的成员函数,如`size()`获取字符串长度,`at()`或`[]`访问特定位置的字符,`substr()`截取子串,以及`find()`和`compare()`进行查找和比较操作。对于周期字符串的问题,我们可能需要使用这些函数来...