702 - 连接两个字符串中的不同字符

本文介绍了一种使用LinkedList实现的两字符串拼接并去除重复字符的算法。该方法通过遍历两个字符串并将字符存入两个列表中,然后对比删除彼此中存在的字符,最后将剩余字符重新拼接成新的字符串。

2017.10.24

还是想用string.replaceAll,但是关于正则表达式,确实没有办法很好的处理。真是上火啊。

后来用list这种笨笨的方法。

public class Solution {
    /*
     * @param : the 1st string
     * @param : the 2nd string
     * @return: uncommon characters of given strings
     */
	public String concatenetedString(String s1, String s2) {
	        // write your code here
		LinkedList<Character> list1 = new LinkedList<>();
		LinkedList<Character> list2 = new LinkedList<>();
		for(int i = 0; i < s1.length(); i++){
			list1.add(s1.charAt(i));
		}
		for(int i = 0; i < s2.length(); i++){
			list2.add(s2.charAt(i));
		}
		for(int i = 0; i < list1.size();i++){
			Character c = list1.get(i);
			if(list2.contains(c)){
				while(list1.contains(c)){
					list1.remove(c);
				}
				while(list2.contains(c)){
					list2.remove(c);
				}
				i--;
			}
		}
		String s = "";
		for(Character c : list1){
			s = s+Character.toString(c);
		}
		for(Character c : list2){
			s = s+Character.toString(c);
		}
		return s;
	}
};


&lt;think&gt;我们需要替换字符串两个字符&#39;-&#39;)之间的内容。例如,在字符串 &quot;SL-0703MA-131B&quot; 中,如果我们想替换第一个连字符和第二个连字符之间的内容(即&quot;0703MA&quot;),我们可以用新的字符串替换它。 但是,问题没有明确是第几个连字符之间,所以我们可以考虑两种情况: 1. 替换第一个连字符和第二个连字符之间的内容(即第一个和第二个&#39;-&#39;之间的内容)。 2. 替换任意两个字符之间的内容(需要指定位置)。 由于问题没有具体说明,我将提供一个通用的方法,可以替换第n个连字符和第n+1个连字符之间的内容。 思路: 1. 找到字符串中所有连字符的位置(索引)。 2. 如果我们想要替换第i个连字符和第i+1个连字符之间的内容,我们可以使用子字符串拼接的方式: result = 原字符串.substring(0, 第i个连字符的位置+1) + 替换字符串 + 原字符串.substring(第i+1个连字符的位置); 注意:索引从0开始计数,第一个连字符是索引0,第二个是索引1,以此类推。 例如,替换第一个和第二个之间的内容(i=1,表示第一个和第二个连字符之间,即第一个连字符后的部分直到第二个连字符前): 原字符串&quot;A-B-C&quot; 我们想替换第一个和第二个之间的&quot;B&quot;为&quot;NEW&quot;,那么: 第一部分:从0到第一个连字符后(索引为1,即第一个&#39;-&#39;的位置,然后我们取substring(0, index1+1)得到&quot;A-&quot;) 替换字符串&quot;NEW&quot; 第二部分:从第二个连字符开始(索引为3,即第二个&#39;-&#39;的位置,取substring(3)得到&quot;-C&quot;) 结果为: &quot;A-NEW-C&quot; 但是,如果我们想替换第二个和第三个之间的内容,方法类似。 然而,问题中只提到&ldquo;两个-之间&rdquo;,没有具体说是哪两个。通常,我们可能指的是第一个和第二个之间,或者最后一个和倒数第二个之间?这里我们假设用户想要替换任意两个连续的连字符之间的内容,并提供一个方法,指定要替换的区间(第几个连字符之后,即第几段)。 我们可以设计一个方法,传入原始字符串、要替换的段的起始索引(即第几个连字符之后,从0开始)和替换字符串。 步骤: 1. 找出所有连字符的位置。 2. 如果连字符数量不足2个,无法替换,返回原字符串。 3. 假设我们要替换第k段(k从0开始),即第k个连字符和第k+1个连字符之间的内容。那么我们需要两个字符的位置:第k个和第k+1个。 4. 使用substring拼接:原字符串[0:第k个连字符的位置+1] + 替换字符串 + 原字符串[第k+1个连字符的位置:] 例如,字符串 &quot;A-B-C-D&quot;,我们想替换第二段(即第二个和第三个连字符之间的内容,原始内容为&quot;C&quot;): 第一个连字符位置:1,第二个:3,第三个:5 替换第二段(k=2?注意:段索引一般从0开始) 第0段:第一个连字符前(即第一个&#39;-&#39;之前)的内容,但这里我们讨论的是两个字符之间,所以段索引从0开始表示第一个和第二个连字符之间。 所以,第一段(k=0):在第一个和第二个连字符之间(位置1和3之间)的内容是&quot;B&quot; 第二段(k=1):在第二个和第三个连字符之间(位置3和5之间)的内容是&quot;C&quot; 因此,如果我们想替换第二段,k=1。 具体代码实现如下: &lt;/think&gt;# Java替换两个字符之间的字符串 在Java中替换两个字符(`-`)之间的字符串,关键是定位连字符的位置并处理子字符串。以下是几种常见场景的解决方案: ## 场景1: 替换第一个和第二个连字符之间的内容 ```java public class HyphenReplacer { public static void main(String[] args) { String original = &quot;SL-0703MA-131B&quot;; // 找到第一个连字符位置 int firstDash = original.indexOf(&#39;-&#39;); if (firstDash == -1) { System.out.println(&quot;字符串中没有连字符&quot;); return; } // 找到第二个连字符位置 int secondDash = original.indexOf(&#39;-&#39;, firstDash + 1); if (secondDash == -1) { System.out.println(&quot;字符串只有一个连字符&quot;); return; } // 构建新字符串 String replacement = &quot;NEW&quot;; String result = original.substring(0, firstDash + 1) + replacement + original.substring(secondDash); System.out.println(&quot;替换后: &quot; + result); // 输出: SL-NEW-131B } } ``` ## 场景2: 替换最后两个字符之间的内容 ```java public class HyphenReplacer { public static void main(String[] args) { String original = &quot;SL-0703MA-131B&quot;; // 找到最后一个连字符位置 int lastDash = original.lastIndexOf(&#39;-&#39;); if (lastDash == -1) { System.out.println(&quot;字符串中没有连字符&quot;); return; } // 找到倒数第二个连字符位置 int secondLastDash = original.lastIndexOf(&#39;-&#39;, lastDash - 1); if (secondLastDash == -1) { System.out.println(&quot;字符串只有一个连字符&quot;); return; } // 构建新字符串 String replacement = &quot;NEW&quot;; String result = original.substring(0, secondLastDash + 1) + replacement + original.substring(lastDash); System.out.println(&quot;替换后: &quot; + result); // 输出: SL-NEW-131B } } ``` ## 场景3: 使用正则表达式替换任意两个字符之间的内容 ```java public class HyphenReplacer { public static void main(String[] args) { String original = &quot;SL-0703MA-131B&quot;; String replacement = &quot;NEW&quot;; // 替换第一个和第二个连字符之间的内容 String result1 = original.replaceFirst(&quot;(?&lt;=-)[^-]+(?=-)&quot;, replacement); System.out.println(&quot;替换第一个区间: &quot; + result1); // SL-NEW-131B // 替换所有连字符之间的内容 String result2 = original.replaceAll(&quot;(?&lt;=-)[^-]+(?=-)&quot;, replacement); System.out.println(&quot;替换所有区间: &quot; + result2); // SL-NEW-NEWB } } ``` ### 正则表达式解析: - **`(?&lt;=-)`**: 正向后查找,匹配连字符`-`之后的位置 - **`[^-]+`**: 匹配一个或多个非连字符字符 - **`(?=-)`**: 正向前查找,匹配连字符`-`之前的位置 - **`replaceFirst()`**: 只替换第一个匹配项 - **`replaceAll()`**: 替换所有匹配项 ## 场景4: 通用替换方法(指定替换区间) ```java public class HyphenReplacer { public static String replaceBetweenHyphens(String input, int segmentIndex, String replacement) { int dashCount = 0; int startIndex = -1; int endIndex = -1; for (int i = 0; i &lt; input.length(); i++) { if (input.charAt(i) == &#39;-&#39;) { dashCount++; if (dashCount == segmentIndex) { startIndex = i + 1; // 区间开始位置 } else if (dashCount == segmentIndex + 1) { endIndex = i; // 区间结束位置 break; } } } if (startIndex == -1 || endIndex == -1) { return input; // 未找到指定区间,返回原字符串 } return input.substring(0, startIndex) + replacement + input.substring(endIndex); } public static void main(String[] args) { String original = &quot;SL-0703MA-131B&quot;; // 替换第1个区间(第一个和第二个连字符之间) String result1 = replaceBetweenHyphens(original, 1, &quot;NEW1&quot;); System.out.println(&quot;替换区间1: &quot; + result1); // SL-NEW1-131B // 替换第2个区间(第二个和第三个连字符之间) String result2 = replaceBetweenHyphens(original, 2, &quot;NEW2&quot;); System.out.println(&quot;替换区间2: &quot; + result2); // SL-0703MA-NEW2B } } ``` ### 关键点总结: 1. **定位连字符**:使用`indexOf()`和`lastIndexOf()`方法定位连字符位置 2. **字符串拼接**:使用`substring()`方法分割字符串并进行拼接 3. **正则表达式**:适用于模式匹配的复杂场景 4. **边界处理**:始终检查连字符是否存在以及位置是否有效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值