回文判断和是否包含回文的计算(java版本)

星期日, 2012-01-15 | Author: Lee | JAVA-and-J2EE | 2,197 views

这个是java版的计算回文的几种方式,基本上都算是比较高效的实现,
测试的最后的一个是判断一个字符串中是否位置重排后可以抽出回文的字符串来,当然字符串的长度和字数都不能有变,只是顺序随便排下而已:
这个是想到的快速的一种判断,还有一个是比较慢的就不贴了,如果你有更好的方法,希望回帖告知,也学习学习,源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package com.i5a6.test;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
public class TestPalindrome {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String str = "11223344中国中国国";
 
		// System.out.println(isPalindromeForLen(str));
		// System.out.println(isPalindromeForStringBuf(str));
		//System.out.println(isPalindromeForLenStringBuf(str));
		System.out.println(isInnerPalindrome(str));
 
	}
 
	/**
	 * 检测是否字符串长度不变情况下的任意组合可以出回文的检测方法 (即是否包含回文的混排) 
	 * ex:"11223344中国中国国"----->"中国1234国4321国中" return true
	 * 只是用2次循环1次排序,算是比较节省的
	 * @param str
	 * @return
	 */
	private static boolean isInnerPalindrome(String str) {
		if (str == null || str.length() == 1) {
			return false;
		}
		int len = str.length();
		List<Character> list = new ArrayList<Character>();
		for (int i = 0; i < len; i++) {
			list.add(str.charAt(i));
		}
		Collections.sort(list);
		int oddNum = 0;
		Character tempChar = null;
		int tempCnt = 0;
		for (int j = 0; j < len; j++) {
			char listC = list.get(j);
			boolean isChange = false;
			if (tempChar == null) {
				tempChar = listC;
			}
			if (tempChar.charValue() == listC) {
				tempCnt++;
			} else {
				if (tempCnt % 2 == 1) {
					oddNum++;
				}
				isChange = true;
				tempChar = listC;
				tempCnt = 1;
			}
 
			if ((j == (len - 1)) && (tempCnt % 2 == 1)) {
				oddNum++;
			}
			if ((isChange || (j == (len - 1))) && (oddNum > 1)) {
				return false;
			}
		}
 
		return true;
 
	}
 
	/**
	 * 尾部倒序比较法
	 * 
	 * @param str
	 * @return
	 */
	private static boolean isPalindromeForLenStringBuf(String str) {
		if (str == null || str.length() == 1) {
			return false;
		}
		int len = str.length();
		StringBuffer sb = new StringBuffer();
		for (int i = (len - 1); i >= 0; i--) {
			sb.append(str.charAt(i));
		}
		return str.equals(sb.toString());
	}
 
	/**
	 * 循环长度校验
	 * 
	 * @param str
	 * @return
	 */
	private static boolean isPalindromeForLen(String str) {
		if (str == null || str.length() == 1) {
			return false;
		}
		int len = str.length();
		for (int i = 0; i < len / 2; i++) {
			char first = str.charAt(i);
			char end = str.charAt(len - i - 1);
			if (first != end) {
				return false;
			}
		}
		return true;
	}
 
	/**
	 * 使用stringbuffer 检查是否为回文
	 * 
	 * @param str
	 * @return
	 */
	private static boolean isPalindromeForStringBuf(String str) {
		if (str == null || str.length() == 1) {
			return false;
		}
		StringBuffer sb = new StringBuffer(str);
		String rvStr = sb.reverse().toString();
		if (rvStr.equals(str)) {
			return true;
		}
		return false;
	}
 
}

Tags: , ,

文章作者: Lee

本文地址: http://blog.i5a6.com/875.html

除非注明,I5A6文章均为原创,转载请以链接形式标明本文地址

还没有评论呢。

留下评论

Rss

Search

文章分类

Meta