`
jbm3072
  • 浏览: 211528 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[输入一个字符串,输出该字符串中对称的子字符串的最大长度][解题方法]

阅读更多

题目

 

     输入一个字符串,输出该字符串中对称的子字符串的最大长度。
     比如输入字符串"google",由于该字符串里最长的对称子字符串是"goog",因此输出4。

 

思想

         首先想到的是采用穷举的方法来分析该问题. 即从最大的对称串开始判断,如果不是,减小一,再找存在不存在对应长度的字符串,依次直到找到对称串长度,返回。

 

        上述方法有点像暴力破解。且没有利用以前的结果。

 

 

     先设置最大对称串长度max1,然后找长度是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
0
分享到:
评论
4 楼 fayedShih 2011-09-21  
没有对齐,再发一次。

public class FindSymmetric {
public static void main(String[] args) {
FindSymmetric fs = new FindSymmetric();
String s = "abcabccbaaddsaddaaddaswdfwfwss";
String matched = fs.findMatch(s);
if (matched != null)
System.out.println("Longest symmetric string '" + matched + "'");
}

private String findMatcicih(String s) {
char[] chars = s.toCharArray();
// System.out.println("start is "+start+" end is "+end);
int max = 0, start = 0, end = 0, i, j;
for (i = 0; i < chars.length; i++)
for (j = chars.length - 1; j > i; j--) {
// System.out.println("chars[j] is " + chars[j]);
if (chars[i] == chars[j]) {
// System.out.println("matched");
if (j - i > max && isSymmetric(chars, i, j)) {
// System.out.println("j is " + j);
max = j - i;
start = i;
end = j;
}
}
}
if (max > 0)
return s.substring(start, end + 1);
System.out.println("Asymmetric string");
return null;
}

private boolean isSymmetric(char[] chars, int i, int j) {
if ((j - i) % 2 == 0)
return false;
for (; i < j; i++, j--)
if (chars[i] != chars[j])
return false;
return true;
}
}
3 楼 fayedShih 2011-09-21  
只做了个偶数的对称匹配。

public class FindSymmetric {
public static void main(String[] args) {
FindSymmetric fs = new FindSymmetric();
String s = "abcabccbaaddsaddaaddaswdfwfwss";
String matched = fs.findMatch(s);
if (matched != null)
System.out.println("Longest symmetric string '" + matched + "'");
}

private String findMatch(String s) {
char[] chars = s.toCharArray();
// System.out.println("start is "+start+" end is "+end);
int max = 0, start = 0, end = 0, i, j;
for (i = 0; i < chars.length; i++)
for (j = chars.length - 1; j > i; j--) {
// System.out.println("chars[j] is " + chars[j]);
if (chars[i] == chars[j]) {
// System.out.println("matched");
if (j - i > max && isSymmetric(chars, i, j)) {
// System.out.println("j is " + j);
max = j - i;
start = i;
end = j;
}
}
}
if (max > 0)
return s.substring(start, end + 1);
System.out.println("Asymmetric string");
return null;
}

private boolean isSymmetric(char[] chars, int i, int j) {
if ((j - i) % 2 == 0)
return false;
for (; i < j; i++, j--)
if (chars[i] != chars[j])
return false;
return true;
}
}
2 楼 jbm3072 2011-06-08  
Jathon_hs 写道
试试这个

		String str = "abcabccbaaddsaddaaddaswdfwfwss";
		char[] c = str.toCharArray();
		int max = 0;
		for (int i = 0; i < c.length - 1; i++) {
			if (c[i] == c[i + 1]) {
				for (int m = i - 1, n = i + 2; m >= 0 && n < c.length; m--, n++) {
					if (c[m] != c[n]) {
						int t = n - m - 1;
						if (t > max) {
							max = t;
						}
						break;
					}
				}
			}
		}

		System.out.println(max);

这个代码MS没有考虑"aba"这样的对称字符情况。
1 楼 Jathon_hs 2011-06-08  
试试这个

		String str = "abcabccbaaddsaddaaddaswdfwfwss";
		char[] c = str.toCharArray();
		int max = 0;
		for (int i = 0; i < c.length - 1; i++) {
			if (c[i] == c[i + 1]) {
				for (int m = i - 1, n = i + 2; m >= 0 && n < c.length; m--, n++) {
					if (c[m] != c[n]) {
						int t = n - m - 1;
						if (t > max) {
							max = t;
						}
						break;
					}
				}
			}
		}

		System.out.println(max);

相关推荐

    删除给定字符串中的数字字符,并输出删除数字字符后的字符串

    解题方法是通过遍历字符串,对于每个字符,如果它不是数字字符,则将其复制到新的字符串中,最后在新字符串的末尾添加一个空字符('\0'),表示字符串的结束。 具体实现上,定义了一个delnum函数,该函数接受一个字符...

    C语言字符串练习(习题+答案).zip

    5. 字符串长度:strlen()函数计算字符串的长度,但不包括结束的空字符'\0'。 6. 字符串格式化:学习使用printf()和scanf()函数处理字符串输入和输出,以及如何使用sprintf()和sscanf()在内存中操作字符串。 7. ...

    统计字符串中数字、字母和空格的个数

    题目要求编写一个程序,该程序能够读取一个长度不超过50个字符的字符串,并统计其中的数字、字母和空格的数量。这涉及到字符串处理的基础知识,包括字符类型的识别和计数。 #### 解题思路与算法分析 1. **输入**:...

    字符串面试题整理

    1. **字符串循环左移**:给定一个字符串和一个整数k,将字符串中的每个字符向左移动k个位置。例如,字符串"abcdefg",k=2,移动后的结果为"efgabcd"。可以使用双指针技巧,将字符串分为两部分,然后交换它们。 2. *...

    最长的美好子字符串(python接口函数调用)1

    在给定的问题中,我们面临着一个字符串处理任务,目标是找到一个给定字符串中的最长美好子字符串。美好字符串是指在该字符串中,每个出现的字符(大写或小写)都有其对应的大写或小写形式同时存在。例如,"abABB" ...

    OJ_字符串加解密

    4. **字符串处理函数**:C语言中的`strlen()`用于获取字符串长度,`strcpy()`和`strncpy()`用于复制字符串,`strcat()`和`strncat()`用于连接字符串,`strchr()`和`strstr()`用于查找子字符串,这些函数可以辅助我们...

    蓝桥杯国赛题之C++字符串输入输出函数.zip

    在C++编程语言中,字符串处理是至关重要的一个部分,特别是在参加像“蓝桥杯”这样的编程竞赛中。本文将详细探讨C++中的字符串输入输出函数,帮助参赛者更好地理解和运用这些工具,以解决竞赛中遇到的问题。 1. **...

    程序员面试题精选-输出一个字符串的所有子串

    本题目的核心是输出一个给定字符串的所有子串,这里我们以字符串 "abc" 为例来详细讲解解题思路和方法。 首先,我们需要理解子字符串的概念。在字符串 "abc" 中,它的每一个字符(如 "a", "b", "c")以及由连续字符...

    字符串处理算法

    Rabin-Karp算法特别适用于字符串长度较短且字符种类有限的情况。在Java中,HashMap是一个重要的数据结构,它实现了基于哈希表的映射机制,提供了诸如put、get、containsKey等操作。 接着,让我们看一下KMP算法。KMP...

    给定一个字符串,求出其最长的重复子串(腾讯2011年10月15日校招笔试)

    根据给定的文件信息,本篇文章将详细解析“给定一个字符串,求出其最长的重复子串”这一算法问题。此题目源自于腾讯2011年10月15日的校园招聘笔试,主要考察应试者对字符串处理、排序及模式匹配等算法的理解与应用...

    华为OD机试C卷- 最长子字符串的长度(一).md-私信看全套OD代码及解析

    任务是在这个环形字符串中找到一个子字符串,要求该子字符串中字符`o`出现的次数为偶数,并且该子字符串尽可能长。最终输出这个最长子字符串的长度。 **输入描述**: - 输入是一个小写字母组成的字符串`s`。 - 字符...

    基于字符串模式匹配算法的病毒感染检测问题 实验四(源代码+实验报告)

    虽然简单,但效率较低,时间复杂度为O(n*m),n为主字符串长度,m为模式字符串长度。 2. **KMP算法**(Knuth-Morris-Pratt):通过预处理模式字符串构建失配表,避免不必要的回溯,提高了效率。时间复杂度仍为O(n)。...

    亲密字符串判断1

    6. 如果字符串长度相同,只在一个位置上不同,那么它们不是亲密字符串。 7. 如果字符串长度相同,且所有位置上的字符都相同,但没有重复的字符,那么它们不是亲密字符串。如果存在重复的字符,可以通过交换这些重复...

    整理字符串1

    标题中的“整理字符串1”指的是一个编程问题,目标是整理给定的字符串使其符合特定的规则。描述中进一步解释了这个规则:相邻的字符 s[i] 和 s[i+1] 必须不满足以下两个条件之一:如果 s[i] 是小写字母,则 s[i+1] ...

    小写字母转化成大写字母

    编写一个程序,该程序接收一个字符串作为输入,并将字符串中所有的小写字母转换为大写字母。例如,如果输入的字符串是 "hello world",则输出应为 "HELLO WORLD"。 #### 输入 一个字符串,长度不超过200个字符。 ...

    c语言作业题

    - **解析**: 设计一个两位数加法测验程序,要求能够记录用户的答题情况,并统计答对和答错的题目数量。涉及到循环结构的设计以及基本的错误处理机制。 **E31. 循环嵌套、穷举法** - **知识点**: 穷举法、循环结构。...

    11.罗穗骞《后缀数组——处理字符串的有力工具》.zip

    倍增算法利用了后缀数组的一些性质,通过逐步增加比较长度来构建,其时间复杂度可以达到O(n log^2 n),n为字符串长度。而DC3(Doubly-Comparing Three Characters)算法则是基于字符的字典序,通过三字符的比较来...

    蓝桥杯国赛题之C++周期字符串.zip

    这个类提供了丰富的成员函数,如`size()`获取字符串长度,`at()`或`[]`访问特定位置的字符,`substr()`截取子串,以及`find()`和`compare()`进行查找和比较操作。对于周期字符串的问题,我们可能需要使用这些函数来...

Global site tag (gtag.js) - Google Analytics