锁定老帖子 主题:合并字符串中所有的子字符串
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-10
网上看了一个面试题,感觉挺有意思,试着实现了一下,如下代码 package sort; /** * @author ty93 * @难度 *** * @算法: 合并一个字符串中的所有子字符串 例如12342343454565678789->123456789 */ public class StringCombin { public static String fatherString = ""; public static String getString(String str) { String stmp = ""; int i; c: for (i = fatherString.length(); i < str.length(); i++) { if (fatherString.contains(String.valueOf(str.charAt(i)))) { int origin = i; int j; if (i == str.length() - 1) { String tempString = str.substring(str.length() - 2); if (!fatherString.contains(tempString)) fatherString += tempString; break; } else if (i == str.length()) { fatherString += str.substring(str.length() - 1); break; } for (j = origin + 1; j < str.length(); j++) { String innString = str.substring(origin, j); if (fatherString.contains(innString)) { } else { if (j - origin > 2) { StringBuffer sb = new StringBuffer(str); stmp = sb.delete(origin, j - 1).toString(); fatherString = ""; break c; } else { stmp = str; fatherString = fatherString + str.substring(origin, j - 1); break; } } } } else { fatherString = fatherString + String.valueOf(str.charAt(i)); } } if (i == str.length()) { return fatherString; } System.out.println(stmp + "_" + fatherString); return getString(stmp); } public static void main(String[] args) { StringBuffer str = new StringBuffer("12342343454565678789"); System.out.println(getString(str.toString())); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-06-10
先自己写一个 然后再看你的
|
|
返回顶楼 | |
发表时间:2011-06-10
其实就是去除重复字符,原字符串里面的单个字符也是子串。
利用HashMap public static String getString(String str) { Map<String,String> strMap = new LinkedHashMap<String,String>(); for (int i = 0; i < str.length(); i++) { String ch = String.valueOf(str.charAt(i)); if(!strMap.containsKey(ch)){ strMap.put(ch, ch); } } StringBuffer sb = new StringBuffer(); Set<Entry<String, String>> entrySet = strMap.entrySet(); for (Entry<String, String> entry : entrySet) { sb.append(entry.getValue()); } return sb.toString(); } |
|
返回顶楼 | |
发表时间:2011-06-10
ptma 写道 其实就是去除重复字符,原字符串里面的单个字符也是子串。
利用HashMap public static String getString(String str) { Map<String,String> strMap = new LinkedHashMap<String,String>(); for (int i = 0; i < str.length(); i++) { String ch = String.valueOf(str.charAt(i)); if(!strMap.containsKey(ch)){ strMap.put(ch, ch); } } StringBuffer sb = new StringBuffer(); Set<Entry<String, String>> entrySet = strMap.entrySet(); for (Entry<String, String> entry : entrySet) { sb.append(entry.getValue()); } return sb.toString(); } 双字以上才叫子串吧。。。。 |
|
返回顶楼 | |
发表时间:2011-06-10
最后修改:2011-06-10
抛出异常的爱 写道 双字以上才叫子串吧。。。。 理论上:字符串 s1 中任意个连续的字符组成的子序列 s2 被称为是 s1 的子串,而称 s1 是 s2 的主串。 特别地,空串是任意串的子串。 -- 不过这个要看具体的业务需求 |
|
返回顶楼 | |
发表时间:2011-06-10
这道面试题肯定不是让你用set来实现的。 这属于jdk自带功能,本来就是要考你的想法
贴个自己写的 没考虑那么多 总之是实现了功能 /** * 合并一个字符串中的所有子字符串 例如12342343454565678789->123456789 * * @param input * @return merge result */ public static String mergeAll(String input) { final int length = input.length(); char[] output = new char[length]; final char[] inputArr = input.toCharArray(); int i = 0; int index = 0; for (char c : inputArr) { boolean exist = false; for (int j = 0; j < i; j++) { if (inputArr[j] == c) { exist = true; break; } } if (!exist) { output[index++] = c; } i++; } return new String(output).trim(); } |
|
返回顶楼 | |
发表时间:2011-06-10
抛出异常的爱 写道 ptma 写道 其实就是去除重复字符,原字符串里面的单个字符也是子串。
利用HashMap public static String getString(String str) { Map<String,String> strMap = new LinkedHashMap<String,String>(); for (int i = 0; i < str.length(); i++) { String ch = String.valueOf(str.charAt(i)); if(!strMap.containsKey(ch)){ strMap.put(ch, ch); } } StringBuffer sb = new StringBuffer(); Set<Entry<String, String>> entrySet = strMap.entrySet(); for (Entry<String, String> entry : entrySet) { sb.append(entry.getValue()); } return sb.toString(); } 双字以上才叫子串吧。。。。 我感觉应该是双字或者以上才能叫字符串,应该是不能用set不然这道题的难度就大打折扣了, |
|
返回顶楼 | |
发表时间:2011-06-10
说不定人家就是考你set相关内容呢?!不要乱揣测
zha_zi 写道 抛出异常的爱 写道 ptma 写道 其实就是去除重复字符,原字符串里面的单个字符也是子串。
利用HashMap public static String getString(String str) { Map<String,String> strMap = new LinkedHashMap<String,String>(); for (int i = 0; i < str.length(); i++) { String ch = String.valueOf(str.charAt(i)); if(!strMap.containsKey(ch)){ strMap.put(ch, ch); } } StringBuffer sb = new StringBuffer(); Set<Entry<String, String>> entrySet = strMap.entrySet(); for (Entry<String, String> entry : entrySet) { sb.append(entry.getValue()); } return sb.toString(); } 双字以上才叫子串吧。。。。 我感觉应该是双字或者以上才能叫字符串,应该是不能用set不然这道题的难度就大打折扣了, |
|
返回顶楼 | |
发表时间:2011-06-10
没有这么面试的。。。如果用set会明说
freish 写道 说不定人家就是考你set相关内容呢?!不要乱揣测
zha_zi 写道 抛出异常的爱 写道 ptma 写道 其实就是去除重复字符,原字符串里面的单个字符也是子串。
利用HashMap public static String getString(String str) { Map<String,String> strMap = new LinkedHashMap<String,String>(); for (int i = 0; i < str.length(); i++) { String ch = String.valueOf(str.charAt(i)); if(!strMap.containsKey(ch)){ strMap.put(ch, ch); } } StringBuffer sb = new StringBuffer(); Set<Entry<String, String>> entrySet = strMap.entrySet(); for (Entry<String, String> entry : entrySet) { sb.append(entry.getValue()); } return sb.toString(); } 双字以上才叫子串吧。。。。 我感觉应该是双字或者以上才能叫字符串,应该是不能用set不然这道题的难度就大打折扣了, |
|
返回顶楼 | |
发表时间:2011-06-10
wanbin021614 写道 这道面试题肯定不是让你用set来实现的。 这属于jdk自带功能,本来就是要考你的想法
贴个自己写的 没考虑那么多 总之是实现了功能 /** * 合并一个字符串中的所有子字符串 例如12342343454565678789->123456789 * * @param input * @return merge result */ public static String mergeAll(String input) { final int length = input.length(); char[] output = new char[length]; final char[] inputArr = input.toCharArray(); int i = 0; int index = 0; for (char c : inputArr) { boolean exist = false; for (int j = 0; j < i; j++) { if (inputArr[j] == c) { exist = true; break; } } if (!exist) { output[index++] = c; } i++; } return new String(output).trim(); } 要求是剔除重复的子字符串, 我认为剔除的过程 例如 13456234523745892375923857 下边是人工剔除步骤 步骤1:13456234523745892375923857 剔除345得到结果 13456223745892375923857 2:13456223745892375923857 剔除45得到结果 134562237892375923857 3:134562237892375923857 剔除237得到结果 134562237895923857 4:134562237895923857 剔除23 得到结果 1345622378959857 最后结果是 1345622378959857 得到结果1345622378959857 这个结果才是没有含有任何重复的子字符串 而且要考虑剔除节点的问题,和字符串末尾的处理 |
|
返回顶楼 | |