码迷,mamicode.com
首页 > 其他好文 > 详细

Simplify Path--LeetCode

时间:2015-04-03 13:34:17      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:leetcode   c++   算法   

题目:

Given an absolute path for a file (Unix-style), simplify it.

For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

click to show corner cases.

Corner Cases:
  • Did you consider the case where path = "/../"?
    In this case, you should return "/".
  • Another corner case is the path might contain multiple slashes ‘/‘ together, such as "/home//foo/".
    In this case, you should ignore redundant slashes and return "/home/foo".

思路:使用栈辅助数据结构,来遍历整个字符串,注意在遍历字符串,根据当前字符和栈顶的字符来消除栈空间的内容,最后栈中留下的东西正好是最终的路径,不过觉得使用向量也非常合适

#include <iostream>
#include <string>
#include <vector>
#include <stack>
 
using namespace std;

/*
给一个Unix下面的路径表示方式 
给出最终的结果 使用栈来消除复杂的表达方式 
*/
string SimplifyPath(string& str)
{
	string result;
	stack<char> st;
	if(str.length() == 0 || str[0] !='/')
		return result;
	int i;
	char tmp;
	st.push(str[0]);
	for(i=1;i<str.length();i++)
	{
		tmp = st.top();
		if(isalpha(str[i])) //是字母 
			st.push(str[i]);
		if(str[i]=='/' && i!=str.length()-1)
		{
			if(tmp != '/' && tmp != '.') // 斜线 
			{
				st.push(str[i]);
			}	
			if(tmp == '.')
			{
				st.pop();
			}
		}
		
		if(str[i]=='.') //逗点 
		{
			if(tmp == '.')
			{
				st.pop();
				st.pop();
				if(!st.empty())
					tmp = st.top();
				while(!st.empty() && tmp != '/')
				{
					st.pop();
					tmp = st.top();
				}
				if(st.empty())
					st.push('/');
			}
			else
				st.push(str[i]);
		}
	}
	result.append(st.size(),'c');
	i=st.size()-1;	
	while(!st.empty())
	{
		tmp = st.top();
		st.pop();
		result[i--] = tmp;
	}
	
	return result;
} 
int main()
{
	string str("/a/./b/../../c/");
	//string str("/../");
	cout<<SimplifyPath(str); 
	return 0;
}


Simplify Path--LeetCode

标签:leetcode   c++   算法   

原文地址:http://blog.csdn.net/yusiguyuan/article/details/44853291

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!